IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)MSSQL → 如何由Sybase向SQL Server移植數(shù)據(jù)庫(kù)

如何由Sybase向SQL Server移植數(shù)據(jù)庫(kù)

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(1)

最近參與了將一個(gè)Sybase數(shù)據(jù)庫(kù)移植到Microsoft SQL Server 2000上的項(xiàng)目,我在這一項(xiàng)目上獲得的經(jīng)驗(yàn),將對(duì)Sybase數(shù)據(jù)庫(kù)管理員把Sybase數(shù)據(jù)庫(kù)移植到SQL Server 2000平臺(tái)上有一定的幫助。

盡管二者之間的一些差別是相當(dāng)大的,例如Sybase數(shù)據(jù)庫(kù)管理系統(tǒng)中的存儲(chǔ)過(guò)程在SQL Server就不能被編譯,而其它差別則不太大。在完成這一轉(zhuǎn)換前,對(duì)腳本文件和存儲(chǔ)過(guò)程中編程邏輯的行為和結(jié)果進(jìn)行測(cè)試是很有必要的。

在下面的部分中,我們將討論這二種數(shù)據(jù)庫(kù)系統(tǒng)之間的一些主要的不同點(diǎn),在移植的規(guī)劃階段,我們必須仔細(xì)研究這些區(qū)別。

數(shù)據(jù)兼容模式

對(duì)SQL Server 2000和Sybase之間的一些兼容性差別的一個(gè)臨時(shí)性解決方案是改變SQL Server中的數(shù)據(jù)庫(kù)兼容性級(jí)別,使之與Sybase相符。為此,我們可以使用sp_dbcmptlevel存儲(chǔ)過(guò)程。

下面表中的語(yǔ)句和結(jié)果顯示出不同版本數(shù)據(jù)庫(kù)之間的差別:

注意:

1、當(dāng)兼容性模式被設(shè)置為70時(shí),下面的詞匯不能被用作對(duì)象名和標(biāo)識(shí)符:BACKUP、DENY、PRECENT、RESTORE和TOP。

2、當(dāng)兼容性模式被設(shè)置為65時(shí),下面的詞匯不能被用作對(duì)象名和標(biāo)識(shí)符:AUTHORIZATION、CASCASE、CROSS、DISTRIBUTED、ESCAPE、FULL、INNER、JOIN、LEFT、OUTER、PRIVILEGES、RESTRICT、RIGHT、SCHEMA和WORK。

下面是sp_dbcmptlevel的語(yǔ)法:

sp_dbcmptlevel [[@dbname=] name][,[@new_cmptlevel=]version]

@dbname是用于檢查和改變兼容性水平的數(shù)據(jù)庫(kù)名字。

@new_cmptlevel決定數(shù)據(jù)庫(kù)被設(shè)置的兼容性水平(將它設(shè)置為70、65、60,缺省值為NULL)。

例如:

sp_dbcmptlevel pubs

這一行代碼返回下面的結(jié)果:

The current compatibility level is 70.(當(dāng)前的兼容性級(jí)別為70。)

現(xiàn)在我們來(lái)看一下另外一個(gè)例子:

sp_dbcmptlevel pubs, 65

它返回如下的結(jié)果:

DBCC execution completed. (DBCC執(zhí)行結(jié)束。)

如果DBCC打印出錯(cuò)誤信息,則需要與系統(tǒng)管理員聯(lián)系。我們可以使用rerunsp_dbcmptlevel驗(yàn)證pubs數(shù)據(jù)庫(kù)是否修改得正確:

sp_dbcmptlevel pubs

它返回下面的結(jié)果:

The current compatibility level is 65(當(dāng)前的兼容性級(jí)別為65。)

除了上面的例子外,兼容性級(jí)別的差別還擴(kuò)展到了保留字。Sybase和SQL Server都有許多不能被用作數(shù)據(jù)庫(kù)中對(duì)象名字的的保留字,二種產(chǎn)品的保留字相似,但并不完全相同。

由于能夠在Sybase中使用的對(duì)象可能不能在SQL Server中使用,這一問(wèn)題使得由Sybase向SQL Server的移植憑添了許多困難。下面是在SQL Server中是保留字,而在Sybase中不是保留字的詞匯清單。

注意:名字為下列清單中詞匯的Sybase數(shù)據(jù)庫(kù)中的對(duì)象在移植到SQL Server數(shù)據(jù)庫(kù)時(shí)必須換為其它名字。

BACKUP COLUMN COMMITTED CONTAINS CONTAINSTABLE

CROSS CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER

DENY DISTRIBUTED FILE FLOPPY FREETEXT

FREETEXTTABLE FULL IDENTITYCOL INNER JOIN

事務(wù)管理模式:

Sybase SQL Server

Set chained [ on : off ] Set implicit_transactions [on : off ]

在Sybase中使用下面的代碼判斷事務(wù)模式:

SELECT @@tranchained

GO

下面是可能返回的結(jié)果:

0 表明使用的是非鏈鎖式事務(wù)模式。

1 表明連接運(yùn)行在鏈鎖模式下。

在SQL Server中使用下面的代碼判斷事務(wù)模式:

IF (@@options & 2) > 0

PRINT on

ELSE

PRINT off

下面是可能的返回結(jié)果:

0 off

>0 on

隔離水平

在一個(gè)關(guān)系數(shù)據(jù)庫(kù)這樣的多線程應(yīng)用軟件中,數(shù)據(jù)庫(kù)引擎對(duì)運(yùn)行的進(jìn)程間的數(shù)據(jù)是如何被隔離的管理是非常重要的,在表示隔離水平時(shí),Sybase和SQL Server的語(yǔ)法是不同的。下面的表格表明了Sybase和SQL Server在表示隔離水平時(shí)的差別。

Sybase SQL Server

0 READ UNCOMMITTED

1 READ COMMITTED

2 REPEATABLE READ

3 SERIALIZABLE

游標(biāo)語(yǔ)法

二種產(chǎn)品中存儲(chǔ)過(guò)程的創(chuàng)建和執(zhí)行基本相似,但在移植時(shí),游標(biāo)語(yǔ)句中的一些例外是我們應(yīng)當(dāng)注意的。下面是一個(gè)例子:

CREATE PROCEDURE sql_cursor AS

DECLARE @lname char(20), @fname char(20)

DECLARE mycursor CURSOR FOR

SELECT au_lname, au_fname FROM authors

OPEN mycursor

FETCH FROM mycursor INTO @lname, @fname

WHILE @@ FETCH_STATUS = 0

/* Sybase數(shù)據(jù)庫(kù)使用@SQLSTATUS而不是@@ FETCH_STATUS */

BEGIN

FETCH FROM mycursor INTO @lname, @fname

/*

** 這里應(yīng)當(dāng)是一些業(yè)務(wù)邏輯

*/

END

CLOSE mycursor

DEALLOCATE /* Sybase數(shù)據(jù)庫(kù)在這里需要CURSOR這個(gè)詞 * / mycursor

Sybase SQL Server

Fetch命令執(zhí)行成功 0 0

Fetch命令執(zhí)行失敗 1 -2

沒(méi)有可存取的記錄了 2 -1

退回觸發(fā)器

SQL Server中不存在這個(gè)命令,因此在向SQL Server移植時(shí),使用了ROLLBACK TRIGGER命令的Sybase存儲(chǔ)過(guò)程必須被進(jìn)行修改。在修改帶有觸發(fā)器的數(shù)據(jù)庫(kù)表中的數(shù)據(jù)時(shí),使用ROLLBACK TRIGGER命令容易引起誤解,一個(gè)ROLLBACK TRIGGER命令只退回觸發(fā)器以及觸發(fā)觸發(fā)器的數(shù)據(jù)修改,如果已經(jīng)被提交了,則事務(wù)的其它部分會(huì)繼續(xù),被寫(xiě)到數(shù)據(jù)庫(kù)中。因此,事務(wù)中的所有語(yǔ)句可能沒(méi)有被成功地完成,但數(shù)據(jù)已經(jīng)被提交了。

下面是Sybase數(shù)據(jù)庫(kù)中一個(gè)使用ROLLBACK TRIGGER的樣例觸發(fā)器:

CREATE TABLE table1 (a int, b int)

GO

CREATE TRIGGER trigger1 on table1 FOR INSERT

AS

IF EXISTS (SELECT 1 FROM inserted WHERE a = 100)

BEGIN

ROLLBACK TRIGGER with RAISERROR 50000 Invalid value for column a

END

INSERT INTO table2

SELECT a, GETDATE() from inserted

RETURN

GO

在上面的代碼中,除非a = 100,則所有插入table1的數(shù)據(jù)也被作為審計(jì)行插入table2中,如果a = 100,ROLLBACK TRIGGER命令被觸發(fā),而INSERT命令沒(méi)有被觸發(fā),批命令的其它部分繼續(xù)執(zhí)行,這時(shí)會(huì)出現(xiàn)錯(cuò)誤信息,表明在一個(gè)INSERT命令中出現(xiàn)了錯(cuò)誤。下面是所有的INSERT命令:

BEGIN TRAN

INSERT INTO table1 valueS (1, 1)

INSERT INTO table1 valueS (100,2)

INSERT INTO table1 valueS (3, 3)

GO

SELECT * FROM table1

在執(zhí)行這些命令后,table1和table2二個(gè)數(shù)據(jù)庫(kù)表將各有2個(gè)記錄,Table1表中的值為1,1以及3,3,由于ROLLBACK TRIGGER命令,第二個(gè)INSERT命令沒(méi)有執(zhí)行;Table2表中的值為1,(當(dāng)前日期)以及3,(當(dāng)前日期),由于當(dāng)a = 100時(shí)ROLLBACK TRIGGER被觸發(fā),觸發(fā)器中的所有處理被中止,100沒(méi)有被插入到Table2表中。

在SQL Server中模擬這一操作需要更多的代碼,外部的事務(wù)必須與保存點(diǎn)同時(shí)使用,如下所示:

CREATE trigger1 on table1 FOR INSERT

AS

SAVE TRAN trigger1

IF EXISTS (SELECT * FROM inserted WHERE a = 100)

BEGIN

ROLLBACK TRAN trigger1

RAISERROR 50000 ROLLBACK

END

INSERT INTO table2

SELECT a, GETDATE() FROM inserted

GO

這一觸發(fā)器以一個(gè)存儲(chǔ)點(diǎn)開(kāi)始,ROLLBACK TRANSACTION只退回觸發(fā)邏輯,而不是整個(gè)事務(wù)(規(guī)模要小于Sybases數(shù)據(jù)庫(kù)中的ROLLBACK TRIGGER語(yǔ)句。對(duì)批命令的修改如下:

BEGIN TRAN

SAVE TRAN save1

INSERT INTO table1 valueS (1, 1)

IF @@error = 50000

ROLLBACK TRAN save1

SAVE TRAN save2

INSERT INTO table1 valueS (100, 1)

IF @@error = 50000

ROLLBACK TRAN save2

SAVE TRAN save3

INSERT INTO table1 valueS (3, 3)

IF @@error = 50000

ROLLBACK TRAN save3

COMMIT TRAN

我們可以發(fā)現(xiàn),改變不可謂不大。由于ROLLBACK TRIGGER命令能夠使任何批命令不能成功執(zhí)行,因此在移植的SQL Server存儲(chǔ)過(guò)程代碼中必須包括另外的邏輯,根據(jù)ROLLBACK TRIGGER的使用,這可能是一個(gè)艱巨而必要的任務(wù),沒(méi)有什么捷徑可走。如果在移植后所有的ROLLBACK TRIGGER命令被改變?yōu)镽OLLBACK TRANSACTION,觸發(fā)器的執(zhí)行也會(huì)發(fā)生變化,因此我們應(yīng)當(dāng)十分小心。

關(guān)鍵詞標(biāo)簽:Sybase,SQLServer,數(shù)據(jù)

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系

相關(guān)下載

    人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法