SQL Server 2012 自帶數(shù)據(jù)庫(kù)維護(hù)工具使用技巧
2012年第二季度,SQL Server 2012就已經(jīng)發(fā)布。作為普通的開(kāi)發(fā)者,并沒(méi)有太多的熱情去追隨這些潮流的技術(shù),經(jīng)過(guò)短暫的嘗鮮,果斷決定放在一邊,不予以理會(huì)。從SQL Server 2000起,就一直把SQL Server作為首選的項(xiàng)目數(shù)據(jù)庫(kù)平臺(tái)。隨著SQL Server 2005, 2008, 2008 R2, 2012等系列版本的陸續(xù)發(fā)布,面臨的問(wèn)題也越來(lái)越多。遇到最多的一個(gè)問(wèn)題是,SQL Server不同版本間的數(shù)據(jù)庫(kù)轉(zhuǎn)化問(wèn)題。
舉例說(shuō)明,在幾百個(gè)客戶中,至今仍然有使用SQL Server 2000的,以我的經(jīng)驗(yàn),這個(gè)版本的SQL Server還有相當(dāng)多的客戶在用。2006年之后的客戶,從開(kāi)始上項(xiàng)目就推薦用SQL Server 2005,所以沿襲過(guò)來(lái),他們一直是這個(gè)版本的。到了2009年,新的客戶又被推薦使用SQL Server 2008或是SQL Server 2008 R2,從理解上來(lái)說(shuō),SQL Server 2008 R2相當(dāng)于SQL Server 2010。再加上這幾個(gè)版本之間有補(bǔ)丁包,SQL Server的版本又增加了好幾個(gè),理論上推薦客戶升級(jí)到最新的補(bǔ)丁包,也有客戶因穩(wěn)定性的原因,拒絕升級(jí)。于是乎,就為一個(gè)SQL Server,就有好多個(gè)版本。作為開(kāi)發(fā)者,一般只有裝最新的SQL Server,以便于防止在查找客戶問(wèn)題時(shí),發(fā)生數(shù)據(jù)庫(kù)版本不兼容,無(wú)法還原數(shù)據(jù)庫(kù)的錯(cuò)誤。然而,最新的SQL Server 2012,不再支持SQL Server 2000的備份文件,這不是個(gè)好消息。
對(duì)于下面的這個(gè)錯(cuò)誤,在客戶比較多的情況下,經(jīng)常會(huì)遇到。比如要拿客戶的數(shù)據(jù)庫(kù)回來(lái)查找問(wèn)題,這個(gè)問(wèn)題經(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ù)庫(kù)的腳本,讓SQL Server只傳輸數(shù)據(jù),而不是既創(chuàng)建表,又傳輸數(shù)據(jù),以減少一些很奇怪的錯(cuò)誤。
這個(gè)工具用的不多,有各種奇怪的問(wèn)題,沒(méi)有積累多的經(jīng)驗(yàn)。
SQL Object Level Recovery Native
RedGate公司SQL Toolbet系列組件的一個(gè),可以從SQL Server的備份文件中生成帶數(shù)據(jù)的SQL語(yǔ)句,在目標(biāo)數(shù)據(jù)庫(kù)中直接執(zhí)行即可。這種方法的成功率很高,簡(jiǎn)單的帶數(shù)據(jù)的SQL INSERT語(yǔ)句,在任何版本的SQL Server中,都可以很正確的插入數(shù)據(jù)。
點(diǎn)擊View Recovery Script,可以查看它生成的SQL 腳本,直接把備份數(shù)據(jù)文件轉(zhuǎn)化為SQL語(yǔ)句,相當(dāng)方便。
目前支持SQL Server 2008 R2的備份集,可以滿足絕大部分客戶的應(yīng)用。
SQL Query Generator
公司的工具庫(kù)里面的一個(gè)工具,一般是給客戶維護(hù)(support)人員用,用于快速導(dǎo)入導(dǎo)出數(shù)據(jù)。
以Northwind數(shù)據(jù)庫(kù)為例子,可以馬上生成這個(gè)表的INSERT語(yǔ)句,保存到剪貼板中,例子語(yǔ)句如下所示
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ù)庫(kù)到另一個(gè)位置,簡(jiǎn)單靈活。對(duì)于圖片數(shù)據(jù),要單獨(dú)處理。對(duì)于有種子字段的列,要在導(dǎo)入前,開(kāi)啟,語(yǔ)句如下所示
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ù)庫(kù)平臺(tái)。你可以運(yùn)用此特點(diǎn),從一個(gè)數(shù)據(jù)庫(kù)中讀取,然后改變連接字符串,在另一個(gè)數(shù)據(jù)庫(kù)中保存,完成數(shù)據(jù)庫(kù)的轉(zhuǎn)移工作。以銷售單為例子,讀取銷售單的代碼,看起來(lái)是這樣的
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í),保存銷售單的代碼,看起來(lái)是這樣的
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代碼,看起來(lái)是這樣子的
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)一步的,這幾句代碼可以寫(xiě)成一個(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ù)庫(kù),兼容于更新的數(shù)據(jù)庫(kù)。為了在不同的版本的SQL Server之間互導(dǎo)數(shù)據(jù),供您參考。
關(guān)鍵詞:SQL,數(shù)據(jù)庫(kù)
閱讀本文后您有什么感想? 已有 人給出評(píng)價(jià)!
- 1
- 1
- 1
- 1
- 1
- 1