2010年7月6日 星期二

MS SQL架構不同,升級至SQL 2008 會遇到的問題

http://technet.microsoft.com/zh-tw/library/ms143179.aspx

本主題描述 Database Engine 中的突破性變更。這些變更可能會中斷以舊版 SQL Server 為根據的應用程式、指令碼或功能。當您升級時可能會遇到這些問題。如需詳細資訊,請參閱<使 用 Upgrade Advisor 來準備升級>。


功能 描述

新的定序

SQL Server 2008 導入了與 Windows Server 2008 所提供之定序完全一致的新定序。這 80 個新定序具有改進的語言精確度,而且是由 *_100 版本參考所表示。如果您針對伺服器或資料庫選擇新的定序,請注意,具有舊版用戶端驅動程式的用戶端可能無法辨識此定序。無法辨識的定序可能會導致應用程式 傳回錯誤並失敗。請考慮下列解決方案:

  • 升級用戶端作業系統,以便更新基礎系統定序。
  • 如果您的用戶端已經安裝了資料庫用戶端軟體,請考慮將服務更新套用至資料庫用戶端軟體。
  • 選擇會對應至用戶端字碼頁的現有定序。


如需詳細資訊,請參閱<設 定和變更定序>。

功能 描述

CLR 組件

當資料庫升級為 SQL Server 2008 時,就會自動安裝支援新資料類型的 Microsoft.SqlServer.Types 組件。Upgrade Advisor 規則會偵測任何具有衝突名稱的使用者類型或組件。Upgrade Advisor 將建議您重新命名任何衝突的組件,以及重新命名任何衝突的類型,或在程式碼中使用兩部分名稱來參考預先存在的使用者類型。

如果資料庫升級偵測到具有衝突名稱的使用者組件,它將自動重新命名該組件並讓資料庫進入質疑模式。

如果具有衝突名稱的使用者類型在升級期間存在,將不會採取任何特殊步驟。在升級之後,舊的使用者類型和新的系統類型都會一 起存在。但是,該使用者類型只能透過兩部分名稱使用。


CLR 組件

SQL Server 2008 會安裝 .NET Framework 3.5 SP1,以便更新全域組件快取 (GAC) 中的程式庫。如果您在 SQL Server 資料庫中註冊了不支援的程式庫,則升級至 SQL Server 2008 之後,SQL Server 應用程式可能會停止運作。這是因為服務或升級 GAC 中的程式庫並不會更新 SQL Server 內部的組件。如果某個組件同時存在 SQL Server 資料庫和 GAC 中,這個組件的兩個副本就必須完全相符。如果它們不相符,當 SQL Server CLR 整合使用該組件時,將會發生錯誤。如需詳細資訊,請參閱<支 援的 .NET Framework 程式庫>。

升級您的資料庫之後,請使用 ALTER ASSEMBLY 陳述式來服務或升級 SQL Server 資料庫內部的組件副本。如需詳細資訊,請參閱知 識庫文件 949080 (機器翻譯)。

若要偵測您是否正在應用程式中使用任何不支援的 .NET Framework 程式庫,請在資料庫中執行下列查詢。

SELECT name FROM sys.assemblies WHERE clr_name LIKE '%publickeytoken=b03f5f7f11d50a3a,%';

CLR 常式


在 CLR 使用者定義函數、使用者定義彙總或使用者定義型別 (UDT) 內部使用模擬可能會導致您的應用程式在升級至 SQL Server 2008 之後失敗並顯示錯誤 6522。

下列狀況在 SQL Server 2005 中會成功,但在 SQL Server 2008 中則會失敗。我們已針對每個狀況提供解決方案。

  1. 使用模擬的 CLR 使用者定義函數、使用者定義彙總或 UDT 方法具有 nvarchar(max)varchar(max)varbinary(max)ntexttextimage 類型的參數或大型 UDT,而且沒有此方法的 DataAccessKind.Read 屬性。
    若要解決這個問題,請加入此方法的 DataAccessKind.Read 屬性、重新編譯組件,然後重新部署常式和組件。
  2. 具有執行模擬之 Init 方法的 CLR 資料表值函式。
    若要解決這個問題,請加入此方法的 DataAccessKind.Read 屬性、重新編譯組件,然後重新部署常式和組件。
  3. 具有執行模擬之 FillRow 方法的 CLR 資料表值函式。
    若要解決這個問題,請從 FillRow 方法中移除模擬。請勿使用 FillRow 方法來存取外部資源。請改從 Init 方法存取外部資源。

檢視 描述

sys.dm_os_sys_info

已移除 cpu_ticks_in_ms 和 sqlserver_start_time_cpu_ticks 資料行。

sys.dm_exec_query_resource_semaphores sys.dm_exec_query_memory_grants

resource_semaphore_id 資料行不是 SQL Server 2008 中的唯一識別碼。這項變更可能會影響疑難排解的查詢執行。如需詳細資訊,請參閱<sys.dm_exec_query_resource_semaphores (Transact-SQL)>。

功能 描述

登入錯誤

在 SQL Server 2005 中,當 SQL 登入用來連接至設定成只使用 Windows 驗證的伺服器時,就會傳回錯誤 18452。在 SQL Server 2008 中,系統會改為傳回錯誤 18456。

功能 描述

執行程序表 XML 結構描述

新的 SeekPredicateNew 元素已加入至執行程序表 XML 結構描述,而且封閉式 xsd 順序 (SqlPredicatesType) 已轉換成 項目。現在,執行程序表 XML 可能會顯示一或多個 SeekPredicateNew 元素,而非一或多個 SeekPredicate 元素。這兩個元素互斥。SeekPredicate 會保留在執行程序表 XML 結構描述中,以便與舊版相容。不過,在 SQL Server 2008 中建立的查詢計畫可能會包含 SeekPredicateNew 元素。如果 SeekPredicate 元素不存在,預期要從節點 ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/RelOp/IndexScan/SeekPredicates 中單獨擷取 SeekPredicate 子系的應用程式可能會失敗。請重新撰寫此應用程式,以便預期這個節點中的 SeekPredicateSeekPredicateNew 元素。如需詳細資訊,請參閱<資 料分割資料表和索引上的查詢處理增強功能>。

執行程序表 XML 結構描述

新的 IndexKind 屬性已加入至執行程序表 XML 結構描述中的 ObjectType 複雜類型。針對 SQL Server 2005 結構描述嚴格驗證 SQL Server 計畫的應用程式將會失敗。

功能 描述

ALTER_AUTHORIZATION_DATABASE DDL 事件

在 SQL Server 2005 中,當 DDL 事件 ALTER_AUTHORIZATION_DATABASE 引發時,如果資料定義語言 (Data Definition Language,DDL) 作業中安全性實體的實體類型是物件,值 'object' 就會傳入這個事件之 EVENTDATA xml 的 ObjectType 元素中。在 SQL Server 2008 中,則會傳回實際類型 (例如 'table' 或 'function')。


CONVERT

如果您將無效的樣式傳遞給 CONVERT 函數,當轉換類型為二進位對字元或字元對二進位時,系統就會傳回錯誤。在舊版 SQL Server 中,無效的樣式會設定為二進位對字元或字元對二進位轉換的預設樣式。


GRANT/DENY/REVOKE 組件的 EXECUTE

您無法針對組件授與、拒絕或撤銷 EXECUTE 權限。這個權限沒有任何作用,而且現在會導致錯誤。請改為針對參考此組件方法的預存程序或函數授與、拒絕或撤銷 EXECUTE 權限。


GRANT/DENY/REVOKE 系統類型的權限

您無法針對系統類型授與、拒絕或撤銷權限。在舊版 SQL Server 中,雖然這些陳述式會成功,但是沒有任何作用。在 SQL Server 2008 中,則會傳回錯誤。


OUTPUT 子句

若要避免不具決定性的行為,當檢視表或嵌入資料表值函式中的資料行是由下列其中一種方法所定義時,OUTPUT 子句便不得參考該資料行:

  • 子查詢。
  • 執行使用者或系統資料存取的使用者定義函數,或假設會執行這類存取的使用者定義函數。
  • 在其定義中包含使用者定義函數的計算資料行,而該函數會執行使用者或系統資料存取。

當 SQL Server 在 OUTPUT 子句中偵測到此類資料行時,會引發錯誤 4186。如需詳細資訊,請參閱<MSSQLSERVER_4186>。


OUTPUT INTO 子句

OUTPUT INTO 子句的目標資料表不可以有任何啟用的觸發程序。


precompute rank 伺服器層級選項

SQL Server 2008 不支援這個選項。請盡快修改目前仍使用這項功能的應用程式。


READPAST 資料表提示

當 READ_COMMITTED_SNAPSHOT 資料庫選項設為 ON,而且下列其中一個條件成立時,無法指定 READPAST 資料表提示:

  • 此工作階段的交易隔離等級為 READ COMMITTED。
  • READCOMMITTED 資料表提示也會在查詢中指定。

若要在這些情況下指定 READPAST 提示,請移除 READCOMMITTED 資料表提示 (如果有的話),並在查詢包含 READCOMMITTEDLOCK 資料表提示。


sp_helpuser

下列在 sp_helpuser 預存程序之結果集中傳回的資料行名稱已經變更。

先前的資料行名稱 新的資料行名稱
GroupName RoleName
Group_name Role_name
Group_id Role_id
Users_in_group Users_in_role


透明資料加密

透明資料加密 (TDE) 是在 I/O 層級執行:頁面結構在記憶體中處於未加密狀態,而且只有當頁面寫入磁碟時,才會進行加密。資料庫檔案和記錄檔都會進行加密。當資料庫使用 TDE 時,略過存取頁面之一般 SQL Server 機制 (例如,直接掃描資料或記錄檔) 的協力廠商應用程式將會失敗,因為資料已在檔案中加密。這類應用程式可以運用 Window Cryptographic API 來開發在 SQL Server 外部解密資料的解決方案。

功能 描述

日期時間支援

在 SQL Server 2005 中,xs:timexs:datexs:dateTime 資料類型沒有時區支援。時區資料會對應至 UTC 時區。SQL Server 2008 提供了符合標準的行為,因而產生下列變更:

  • 驗證不含時區的值。
  • 保留提供的時區或缺少的時區。
  • 修改內部儲存體表示法。
  • 增加預存值的解析。
  • 不允許使用負值年份。

修改應用程式和 XQuery 運算式來說明新的類型值。如需詳細資訊,請參閱<搭 配 time、date、datetime2 和 datetimeoffset 資料類型使用 XML>。


XQuery 和 Xpath 運算式

在 SQL Server 2005 中,允許使用 XQuery 或 XPath 運算式開頭為冒號 (':') 的步驟。例如,下列陳述式在冒號開頭的路徑運算式中,包含一個名稱測試 (CTR02))。

SELECT FileContext.query('for n$ in //CTR return {data )(n$/:CTR02)} ) AS Files FROM dbo.MyTable;

在 SQL Server 2008 中不允許此種用法,因為它不符合 XML 標準。傳回錯誤 9341。移除開頭的冒號,或為名稱測試指定一個前置詞,例如,(n$/CTR02) 或 (n$/p1:CTR02)。

功能 說明

使用 SSL 從 SQL Server Native Client 連接

當使用 SQL Server Native Client 連接時,使用 "SERVER=shortname; FORCE ENCRYPTION=true" 而且憑證的主旨可指定完整網域名稱 (FQDN) 的應用程式在過去因為寬鬆的驗證所以已經連接。SQL Server 2008 R2 藉由強制施行憑證的 FQDN 主旨來增強安全性。依賴寬鬆驗證的應用程式必須採取下列其中一項動作:

  • 使用連接字串中的 FQDN。
    • 如果在應用程式外面設定連接字串的 SERVER 關鍵字,這個選項就不需要重新編譯應用程式。
    • 如果是以硬式編碼方式編寫連接字串的應用程式,便無法使用這個選項。
    • 使用資料庫鏡像的應用程式無法使用這個選項,因為鏡像伺服器是以簡單名稱回覆。
  • 加入簡短名稱的別名來對應至 FQDN。
    • 即使是以硬式編碼方式編寫連接字串的應用程式,還是可以使用這個選項。
    • 使用資料庫鏡像的應用程式無法使用這個選項,因為提供者不會尋找接收之容錯移轉夥伴名稱的別名。
  • 擁有針對簡短名稱發出的憑證。
    • 這個選項適用於所有應用程式。