設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 3193|回復(fù): 2
打印 上一主題 下一主題

[ADO/DAO] 如何把SQLServer數(shù)據(jù)庫從高版本降級到低版本?

[復(fù)制鏈接]

點擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2015-9-3 08:15:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
數(shù)據(jù)庫dba版​本降級 sql server如何從高版本向低版本遷移,由于目前還廣泛使用著SQLServer2000,很多公司又想使用新的SQLServer,從而直接【分離/附加】或者【備份/還原】數(shù)據(jù)庫,在不同版本之間存放。往往就會遇到版本不兼容的問題


作者:MVP黃釗吉

前幾天遇到了從我本機2008R2上備份的一個數(shù)據(jù)庫還原到2008上面時報錯:

從運行版本10.50.2500(2008R2是10.50)和10.00.1600(2008是10.00)中可以看出這個版本不兼容問題,大部分情況下,從低版本升級到高版本,只要不是跨度太大,如2000升級到2012,都不會怎么報錯。除非使用了一些新版本不兼容的特性如*=來實現(xiàn)left join的語句。但是就像上圖那樣,從高版本還原到低版本的時候,問題就出現(xiàn)了,而且?guī)缀跻欢〞䦂箦e。
下面給出幾個小建議,例子是從2008 降級到2005:
方法一:使用圖形化操作(GUI),打開SSMS(SQL Server Management Studio)
步驟1:右鍵你要降級的數(shù)據(jù)庫,按下圖選擇:

步驟2:在對話框中選擇:
   步驟3:在【高級】中選擇下圖:

步驟4:把腳本保存起來,然后在SQLServer2005中運行腳本。
步驟5:通過【任務(wù)】→【導入數(shù)據(jù)】,把數(shù)據(jù)從2008導入到使用腳本創(chuàng)建的庫上如下圖,就完成了:



方法二:使用系統(tǒng)自帶的存儲過程實現(xiàn):sp_dbcmptlevel ——將某些數(shù)據(jù)庫行為設(shè)置為與指定的 SQL Server 版本兼容下面是其內(nèi)部實現(xiàn)代碼:

[sql]
SET QUOTED_IDENTIFIER ON  



  • SET ANSI_NULLS ON
  • GO
  • create procedure sys.sp_dbcmptlevel            -- 1997/04/15
  •     @dbname sysname = NULL,                 -- database name to change
  •     @new_cmptlevel tinyint = NULL OUTPUT    -- the new compatibility level to change to
  • as
  •     set nocount    on
  •     declare @exec_stmt nvarchar(max)
  •     declare @returncode int
  •     declare @comptlevel float(8)
  •     declare @dbid int                   -- dbid of the database
  •     declare @dbsid varbinary(85)        -- id of the owner of the database
  •     declare @orig_cmptlevel tinyint     -- original compatibility level
  •     declare @input_cmptlevel tinyint    -- compatibility level passed in by user
  •         ,@cmptlvl80 tinyint             -- compatibility to SQL Server Version 8.0
  •         ,@cmptlvl90 tinyint             -- compatibility to SQL Server Version 9.0
  •         ,@cmptlvl100 tinyint                -- compatibility to SQL Server Version 10.0
  •     select  @cmptlvl80 = 80,
  •             @cmptlvl90 = 90,
  •             @cmptlvl100 = 100
  •     -- SP MUST BE CALLED AT ADHOC LEVEL --
  •     if (@@nestlevel > 1)
  •     begin
  •         raiserror(15432,-1,-1,'sys.sp_dbcmptlevel')
  •         return (1)
  •     end
  •     -- If no @dbname given, just list the valid compatibility level values.
  •     if @dbname is null
  •     begin
  •        raiserror (15048, -1, -1, @cmptlvl80, @cmptlvl90, @cmptlvl100)
  •        return (0)
  •     end
  •     --  Verify the database name and get info
  •     select @dbid = dbid, @dbsid = sid ,@orig_cmptlevel = cmptlevel
  •         from master.dbo.sysdatabases
  •         where name = @dbname
  •     --  If @dbname not found, say so and list the databases.
  •     if @dbid is null
  •     begin
  •         raiserror(15010,-1,-1,@dbname)
  •         print ' '
  •         select name as 'Available databases:'
  •             from master.dbo.sysdatabases
  •         return (1)
  •     end
  •     -- Now save the input compatibility level and initialize the return clevel
  •     -- to be the current clevel
  •     select @input_cmptlevel = @new_cmptlevel
  •     select @new_cmptlevel = @orig_cmptlevel
  •     -- If no clevel was supplied, display and output current level.
  •     if @input_cmptlevel is null
  •     begin
  •         raiserror(15054, -1, -1, @orig_cmptlevel)
  •         return(0)
  •     end
  •     -- If invalid clevel given, print usage and return error code
  •     -- 'usage: sp_dbcmptlevel [dbname [, compatibilitylevel]]'
  •     if @input_cmptlevel not in (@cmptlvl80, @cmptlvl90, @cmptlvl100)
  •     begin
  •         raiserror(15416, -1, -1)
  •         print ' '
  •         raiserror (15048, -1, -1, @cmptlvl80, @cmptlvl90, @cmptlvl100)
  •         return (1)
  •     end
  •     --  Only the SA or the dbo of @dbname can execute the update part
  •     --  of this procedure sys.so check.
  •     if (not (is_srvrolemember('sysadmin') = 1)) and suser_sid() <> @dbsid
  •         -- ALSO ALLOW db_owner ONLY IF DB REQUESTED IS CURRENT DB
  •         and (@dbid <> db_id() or is_member('db_owner') <> 1)
  •     begin
  •         raiserror(15418,-1,-1)
  •         return (1)
  •     end
  •     -- If we're in a transaction, disallow this since it might make recovery impossible.
  •     set implicit_transactions off
  •     if @@trancount > 0
  •     begin
  •         raiserror(15002,-1,-1,'sys.sp_dbcmptlevel')
  •         return (1)
  •     end
  •     set @exec_stmt = 'ALTER DATABASE ' + quotename(@dbname, '[') + ' SET COMPATIBILITY_LEVEL = ' + cast(@input_cmptlevel as nvarchar(128))
  •     -- Note: database @dbname may not exist anymore
  •     exec(@exec_stmt)
  •     select @new_cmptlevel = @input_cmptlevel
  •     return (0) -- sp_dbcmptlevel
  • GO

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱

點擊這里給我發(fā)消息

2#
 樓主| 發(fā)表于 2015-9-3 08:17:05 | 只看該作者
語法




[sql] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
01.sp_dbcmptlevel [ [ @dbname = ] name ]   
02.     [ , [ @new_cmptlevel = ] version ]  
03.   








參數(shù)



[ @dbname = ] name
要為其更改兼容級別的數(shù)據(jù)庫的名稱。數(shù)據(jù)庫名稱必須符合標識符的規(guī)則。name 的數(shù)據(jù)類型為 sysname,默認值為 NULL。
[ @new_cmptlevel = ] version
數(shù)據(jù)庫要與之兼容的 SQL Server 的版本。version 的數(shù)據(jù)類型為 tinyint,默認值為 NULL。該值必須為下列值之一:

80 = SQL Server 2000

90 = SQL Server 2005

100 = SQL Server 2008

返回代碼值


0(成功)或 1(失敗)




注意事項:

后續(xù)版本的 Microsoft SQL Server 將刪除該功能。請不要在新的開發(fā)工作中使用該功能,并盡快修改當前還在使用該功能的應(yīng)用程序。 改為使用 ALTER DATABASE 兼容級別。

補充:



我們在操作數(shù)據(jù)庫的時候,可能會用到數(shù)據(jù)庫降級,該怎么實現(xiàn)呢?實現(xiàn)降級需要滿足的條件是什么呢?本文我們就介紹這些。下面是一個SQL Server 數(shù)據(jù)庫降級的例子,通過這個例子讓我們來一起了解一下這一過程的實現(xiàn)吧。
例子:我的實際情況是:我用SQL SERVER 2008附加了05的庫,后來在部署時發(fā)現(xiàn)數(shù)據(jù)庫無法還原到服務(wù)器上的SQLSERVER2005,我用了如下兩個步驟實現(xiàn)了數(shù)據(jù)庫的降級【其實也就是數(shù)據(jù)庫表結(jié)構(gòu),視圖,存儲過程以及數(shù)據(jù)的拷貝】。
要實現(xiàn)數(shù)據(jù)庫的降級你必須具備以下條件:
1)本機的SQLSERVER不是EXPRESS版本,因為EXPRESS版本的SQLSERVER不支持數(shù)據(jù)的導入導出。
2)服務(wù)器與本機在同一局域網(wǎng),方便數(shù)據(jù)導出。當然,也可以先在本機裝一個低版本的SQLSERVER,實現(xiàn)數(shù)據(jù)庫降級后,用低版本庫還原到服務(wù)器上去。
言歸正傳,以下是具體操作:
1)右鍵需要階級的數(shù)據(jù)庫,生成腳本,將生成的腳本拷貝到服務(wù)器的SQLSERVER上運行【運行時會報不存在對象,因為生成的腳本默認是ALTER操作的,將所有ALTER改為CREATE就可以了】。完成了這一步操作以后,數(shù)據(jù)庫的表結(jié)構(gòu),視圖,存儲過程都已經(jīng)拷貝到了服務(wù)器上了,接下來的工作就是將數(shù)據(jù)庫里的數(shù)據(jù)導出到服務(wù)器SQLSERVER就完成了。
2)還是右鍵目標數(shù)據(jù)庫,點導出數(shù)據(jù),一路下一步就可以完成數(shù)據(jù)的導出了。導出數(shù)據(jù)的過程中選擇對象時只要選擇表就行了,視圖里本來就沒有數(shù)據(jù),就沒必要導出數(shù)據(jù)了。我操作的過程中,有一些表存在只讀字段,無法直接導出數(shù)據(jù)的話,那只能手工了,將特殊的表提出來將數(shù)據(jù)單獨拷貝到服務(wù)器上就OK了。
至此,數(shù)據(jù)庫的階級就完成了,在服務(wù)器上已經(jīng)有了一個低版本的數(shù)據(jù)庫了。
關(guān)于SQL Server數(shù)據(jù)庫降級的知識就介紹到這里了

3#
發(fā)表于 2015-9-3 09:49:23 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 08:23 , Processed in 0.185847 second(s), 26 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表