綠色資源網(wǎng):您身邊最放心的安全下載站! 最新軟件|熱門排行|軟件分類|軟件專題|論壇轉(zhuǎn)帖|廠商大全

綠色資源網(wǎng)

技術(shù)教程
您的位置:首頁數(shù)據(jù)庫類SQL Server → SQL Server 2012 自帶數(shù)據(jù)庫維護(hù)工具使用技巧

SQL Server 2012 自帶數(shù)據(jù)庫維護(hù)工具使用技巧

我要評(píng)論 2012/09/27 20:30:27 來源:綠色資源網(wǎng) 編輯:sonlywya.cn [ ] 評(píng)論:0 點(diǎn)擊:378次

2012年第二季度,SQL Server 2012就已經(jīng)發(fā)布。作為普通的開發(fā)者,并沒有太多的熱情去追隨這些潮流的技術(shù),經(jīng)過短暫的嘗鮮,果斷決定放在一邊,不予以理會(huì)。從SQL Server 2000起,就一直把SQL Server作為首選的項(xiàng)目數(shù)據(jù)庫平臺(tái)。隨著SQL Server 2005, 2008, 2008 R2, 2012等系列版本的陸續(xù)發(fā)布,面臨的問題也越來越多。遇到最多的一個(gè)問題是,SQL Server不同版本間的數(shù)據(jù)庫轉(zhuǎn)化問題。

舉例說明,在幾百個(gè)客戶中,至今仍然有使用SQL Server 2000的,以我的經(jīng)驗(yàn),這個(gè)版本的SQL Server還有相當(dāng)多的客戶在用。2006年之后的客戶,從開始上項(xiàng)目就推薦用SQL Server 2005,所以沿襲過來,他們一直是這個(gè)版本的。到了2009年,新的客戶又被推薦使用SQL Server 2008或是SQL Server 2008 R2,從理解上來說,SQL Server 2008 R2相當(dāng)于SQL Server 2010。再加上這幾個(gè)版本之間有補(bǔ)丁包,SQL Server的版本又增加了好幾個(gè),理論上推薦客戶升級(jí)到最新的補(bǔ)丁包,也有客戶因穩(wěn)定性的原因,拒絕升級(jí)。于是乎,就為一個(gè)SQL Server,就有好多個(gè)版本。作為開發(fā)者,一般只有裝最新的SQL Server,以便于防止在查找客戶問題時(shí),發(fā)生數(shù)據(jù)庫版本不兼容,無法還原數(shù)據(jù)庫的錯(cuò)誤。然而,最新的SQL Server 2012,不再支持SQL Server 2000的備份文件,這不是個(gè)好消息。

對(duì)于下面的這個(gè)錯(cuò)誤,在客戶比較多的情況下,經(jīng)常會(huì)遇到。比如要拿客戶的數(shù)據(jù)庫回來查找問題,這個(gè)問題經(jīng)常出現(xiàn)。如果耐心不好,就干脆裝個(gè)最新的SQL Server,如果不想這樣,下面提供的幾種方法,也許對(duì)你有所幫助。

SQL Server Import/Export

SQL Server自帶的導(dǎo)入導(dǎo)出向?qū)?,大部分情況下有效。我推薦的步驟是先創(chuàng)建目標(biāo)數(shù)據(jù)庫的腳本,讓SQL Server只傳輸數(shù)據(jù),而不是既創(chuàng)建表,又傳輸數(shù)據(jù),以減少一些很奇怪的錯(cuò)誤。

這個(gè)工具用的不多,有各種奇怪的問題,沒有積累多的經(jīng)驗(yàn)。

SQL Object Level Recovery Native

RedGate公司SQL Toolbet系列組件的一個(gè),可以從SQL Server的備份文件中生成帶數(shù)據(jù)的SQL語句,在目標(biāo)數(shù)據(jù)庫中直接執(zhí)行即可。這種方法的成功率很高,簡(jiǎn)單的帶數(shù)據(jù)的SQL INSERT語句,在任何版本的SQL Server中,都可以很正確的插入數(shù)據(jù)。

點(diǎn)擊View Recovery Script,可以查看它生成的SQL 腳本,直接把備份數(shù)據(jù)文件轉(zhuǎn)化為SQL語句,相當(dāng)方便。

目前支持SQL Server 2008 R2的備份集,可以滿足絕大部分客戶的應(yīng)用。

SQL Query  Generator

公司的工具庫里面的一個(gè)工具,一般是給客戶維護(hù)(support)人員用,用于快速導(dǎo)入導(dǎo)出數(shù)據(jù)。

以Northwind數(shù)據(jù)庫為例子,可以馬上生成這個(gè)表的INSERT語句,保存到剪貼板中,例子語句如下所示

INSERT INTO [Employees] ([EmployeeID],[LastName],[FirstName],[Title],[TitleOfCourtesy],[BirthDate],[HireDate],[Address],[City],[Region],[PostalCode],[Country],[HomePhone],[Extension],[Photo],[Notes],[ReportsTo],[PhotoPath])
VALUES(9, N'Dodsworth', N'Anne', N'Sales Representative', N'Ms.', '1966-1-27 0:0:0.0', '1994-11-15 0:0:0.0', N'7 Houndstooth Rd.', N'London', N'', N'WG2 7LT', N'UK', N'(71) 555-4444', N'452', N'System.Byte[]', N'Anne has a BA degree in English from St. Lawrence College.  She is fluent in French and German.', 5, N'http://accweb/emmployees/davolio.bmp')

INSERT INTO [Employees] ([EmployeeID],[LastName],[FirstName],[Title],[TitleOfCourtesy],[BirthDate],[HireDate],[Address],[City],[Region],[PostalCode],[Country],[HomePhone],[Extension],[Photo],[Notes],[ReportsTo],[PhotoPath])
VALUES(8, N'Callahan', N'Laura', N'Inside Sales Coordinator', N'Ms.', '1958-1-9 0:0:0.0', '1994-3-5 0:0:0.0', N'4726 - 11th Ave. N.E.', N'Seattle', N'WA', N'98105', N'USA', N'(206) 555-1189', N'2344', N'System.Byte[]', N'Laura received a BA in psychology from the University of Washington.  She has also completed a course in business French.  She reads and writes French.', 2, N'http://accweb/emmployees/davolio.bmp')

這樣,很方便的搬動(dòng)數(shù)據(jù)庫到另一個(gè)位置,簡(jiǎn)單靈活。對(duì)于圖片數(shù)據(jù),要單獨(dú)處理。對(duì)于有種子字段的列,要在導(dǎo)入前,開啟,語句如下所示

SET IDENTITY_INSERT dbo.ICMOVh OFF 
SET IDENTITY_INSERT dbo.ICMOVD ON

對(duì)于主從表數(shù)據(jù),先導(dǎo)入主表,再導(dǎo)入從表。刪除主從表數(shù)據(jù),則是先刪從表,再刪主表。

LLBL Gen

作為ORM的基本特征,跨數(shù)據(jù)庫平臺(tái)。你可以運(yùn)用此特點(diǎn),從一個(gè)數(shù)據(jù)庫中讀取,然后改變連接字符串,在另一個(gè)數(shù)據(jù)庫中保存,完成數(shù)據(jù)庫的轉(zhuǎn)移工作。以銷售單為例子,讀取銷售單的代碼,看起來是這樣的

public SalesOrderEntity GetSalesOrder(System.String RefNo, IPrefetchPath2 prefetchPath, ExcludeIncludeFieldsList fieldList)
{
            SalesOrderEntity _SalesOrder = new SalesOrderEntity(RefNo);
            using (DataAccessAdapterBase adapter = GetCompanyDataAccessAdapter())
            {
                bool found = adapter.FetchEntity(_SalesOrder, prefetchPath, null, fieldList);
                if (!found) throw new Foundation.Common.RecordNotFoundException("Invalid SalesOrder");
            }
            return _SalesOrder;
}

同時(shí),保存銷售單的代碼,看起來是這樣的

public SalesOrderEntity SaveSalesOrder(SalesOrderEntity SalesOrder, EntityCollection entitiesToDelete, string seriesCode)
 {
            using (DataAccessAdapterBase adapter = GetCompanyDataAccessAdapter())
            {
                try
                {
                    adapter.StartTransaction(IsolationLevel.ReadCommitted, "SaveSalesOrder");
                    adapter.SaveEntity(SalesOrder, true, false);
                    adapter.Commit();
                }
                catch
                {
                    adapter.Rollback();
                    throw;
                }
            }
            return SalesOrder;
}

這些代碼均是由代碼生成器直接生成的。完成數(shù)據(jù)轉(zhuǎn)移的ORM代碼,看起來是這樣子的

string source = "Data Source=192.168.0.96;Initial Catalog=TS;User Id =sa ; Password =holiday;";
string destination = "Data Source=192.168.0.200;Initial Catalog=TS;User Id = sa ; Password = holiday;";
ClientProxyFactory.ConnectionString = source;            
ISalesOrderManager manager = ClientProxyFactory.CreateProxyInstance<ISalesOrderManager>();
SalesOrderEntity salesOrder = manager.GetSalesOrder(customerNo, null);
ClientProxyFactory.ConnectionString = destination;
manager.SaveSalesOrder(salesOrder);

就這樣幾句代碼,把銷售單數(shù)據(jù)從192.168.0.96的機(jī)器搬動(dòng)到192.168..0.200的機(jī)器上。

更進(jìn)一步的,這幾句代碼可以寫成一個(gè)泛型的方法,傳入?yún)?shù),即可達(dá)到批量搬動(dòng)數(shù)據(jù)。

以我的理解和摸索,當(dāng)前仍然是讓項(xiàng)目使用主流的SQL Server 2005,搭配Express版本的SQL Server 2008, 2008 R2,這樣可以讀取高于SQL Server 2005的客戶數(shù)據(jù)庫,兼容于更新的數(shù)據(jù)庫。為了在不同的版本的SQL Server之間互導(dǎo)數(shù)據(jù),供您參考。

關(guān)鍵詞:SQL,數(shù)據(jù)庫

閱讀本文后您有什么感想? 已有 人給出評(píng)價(jià)!

  • 1 歡迎喜歡
  • 1 白癡
  • 1 拜托
  • 1 哇
  • 1 加油
  • 1 鄙視