2010-05-30 92 views
1

我必須要改變一個SQL Server數據庫的整理要求:更改SQL Server數據庫排序

ALTER DATABASE solarwind95 collate SQL_Latin1_General_CP1_CI_AS

,但我得到這個奇怪的錯誤:

Meldung 5075, Ebene 16, Status 1, Zeile 1 Das 'Spalte'-Objekt 'CustomPollerAssignment.PollerID' ist von 'Datenbanksortierung' abhängig. Die Datenbanksortierung kann nicht geändert werden, wenn ein schemagebundenes Objekt von ihr abhängig ist. Entfernen Sie die Anhängigkeiten der Datenbanksortierung, und wiederholen Sie den Vorgang.

對不起,德國errror消息。我不知道如何將語言切換到英文,但這裏是翻譯:

Translation: Message 5075, Layer 16, Status 1, Row 1 The 'column' object 'CustomPollerAssignment.PollerID' depends on 'Database sorting. The database sorting cannot be changed if a schema bound object depends on it. Remove the dependency of the database sortieren and retry.

我得到一噸更像是錯誤的。

回答

3

您需要從您的視圖和表值函數中刪除WITH SCHEMABINDING。要識別他們,你可以查詢INFORMATION_SCHEMA觀點:

SELECT TABLE_SCHEMA, TABLE_NAME AS VIEW_NAME 
FROM INFORMATION_SCHEMA.VIEWS 
WHERE VIEW_DEFINITION LIKE '%SCHEMABINDING%' 

SELECT ROUTINE_SCHEMA, ROUTINE_NAME 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%SCHEMABINDING%' 
  1. 首先備份數據庫。
  2. 生成所有模式綁定視圖和函數的ALTER腳本。
  3. 從腳本中刪除單詞「WITH SCHEMABINDING」。
  4. 運行腳本幾次,直到解決所有參考錯誤。
  5. 更改數據庫的排序規則。
  6. 腳本並刪除所有約束(鍵,檢查和默認值)。
  7. 使用下面的腳本更改每列的排序規則。
  8. 重新創建約束。
  9. 最後,運行原始腳本幾次以啓用架構綁定。

你可以改變所有列的排序規則與此腳本:

DECLARE @collation nvarchar(128) 
DECLARE @commands table ([SQL] nvarchar(max)) 
DECLARE @cursor cursor 
DECLARE @sql nvarchar(max) 

SET @collation = 'SQL_Latin1_General_CP1_CI_AS' 

INSERT @commands ([SQL]) 
SELECT 'ALTER TABLE ' + QUOTENAME(c.TABLE_SCHEMA) +'.'+ QUOTENAME(c.TABLE_NAME) 
    + ' ALTER COLUMN ' + QUOTENAME(c.COLUMN_NAME) 
    + ' ' + c.DATA_TYPE 
    + ISNULL('(' + LTRIM(STR(c.CHARACTER_MAXIMUM_LENGTH)) + ')', '') 
    + ISNULL(' COLLATE ' + @collation, '') 
    + ' ' + CASE c.IS_NULLABLE WHEN 'NO' THEN 'NOT ' ELSE '' END + 'NULL' 
FROM INFORMATION_SCHEMA.COLUMNS c 
INNER JOIN INFORMATION_SCHEMA.TABLES t 
ON t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME 
WHERE t.TABLE_TYPE = 'BASE TABLE' 
AND c.COLLATION_NAME <> @collation 

SET @cursor = CURSOR FOR SELECT [SQL] FROM @commands 
OPEN @cursor 
FETCH NEXT FROM @cursor INTO @sql 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT @sql 
    EXEC (@sql) 

    FETCH NEXT FROM @cursor INTO @sql 
END 
1

這些將是聚集索引的主鍵庫。對於聚集索引,記錄按列的升序存儲,如果更改數據庫的排序規則,則所有表都需要重新排序。

0

在這種情況下,即使刪除架構綁定不會幫你

更改排序規則需要KB 325335

描述的步驟

它主要適用於SQL Server 2000,但適用相同的原理

  • 腳本裸表
  • 腳本約束,觸發器,鑰匙等+的所有代碼,意見等,爲以後
  • 創建新的數據庫裸表
  • DTS或SSIS裸數據
  • 應用腳本來創建的限制,觸發器,鍵,代碼,視圖等
+0

你說「刪除架構綁定不會有幫助」。你有什麼問題?它爲我工作得很好。 – 2010-05-30 15:31:01

+1

@Anthony Faull:改變整理只會改變系統表。要更改用戶表,您必須刪除所有依賴項:SCHEMBINDING只是一個依賴項。所以你的答案中的第6步不足以改變整理,所以它不會幫助你。 – gbn 2010-05-30 15:36:15

+0

你說得很對。我已經擴展了我的答案以改變列。 – 2010-05-30 19:05:03

相關問題