2017-07-31 135 views
1

當我試圖改變從區分大小寫到區分大小寫的數據庫排序規則,如下我得到一個錯誤:阿爾特情況下sentivity

Msg 5030, Level 16, State 2, Line 1 The database could not be exclusively locked to perform the operation. Msg 5072, Level 16, State 1, Line 1 ALTER DATABASE failed. The default collation of database 'e_mail' cannot be set to SQL_Latin1_General_CP1_CS_AS.

請幫我解決這個

+1

請注意,更改數據庫排序規則不會*更改任何現有列的排序規則(只有新創建的排序規則),因此即使語句正常工作,您也可能發現它不符合您的期望。 –

回答

1

我猜你仍然有一堆使用該DB的連接阻止了它被鎖定來改變排序規則。因此,你的錯誤的這一部分:

The database could not be exclusively locked to perform the operation

所以,你需要

  • 安排一些停機
  • 通知用戶
  • 設置你的數據庫到單用戶模式(防止其他連接和鎖)
  • 然後運行您的alter database語句

喜歡的東西...

ALTER DATABASE [e_mail] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
GO 

ALTER DATABASE [e_mail] COLLATE SQL_Latin1_General_CP1_CS_AS; 
GO 

ALTER DATABASE [e_mail] SET MULTI_USER; 
GO 
+0

謝謝scsimon ... –

+0

沒問題@AsankaMahesh – scsimon

0

如果這是一個生產數據庫,這是一個重大的事業,比它的面部出現一個更顯著的變化。這可能是您可以做出的最複雜的更改之一,因爲它會影響數據庫中每個現有的字符串列。如果您仍在開發中,那麼說實話,編寫模式和數據值並在新數據庫中重新開始可能更容易。

爲什麼這麼複雜?主要是因爲更改數據庫排序規則不具有追溯性。它將而不是更改現有對象(表,視圖,udfs等)的排序規則。相反,如果引用字符字段,則需要修改每個對象以糾正它。如果在字符字段中存在索引,主鍵或外鍵或約束,則可能需要先刪除索引,約束或鍵,然後才能更改排序規則,然後再重新添加該對象。當OhioOHIO突然變成等效值時,您還應該確保應用不區分大小寫的排序規則不會創建重複的鍵值。

此外,更改數據庫級別設置不會改變服務器級別排序規則(也就是說,主數據庫上的排序規則)。這意味着您的應用程序數據庫可能沒有與主數據庫和tempdb數據庫相同的排序規則。計劃並進行相應的測試,因爲如果使用tempdb,這可能會導致錯誤。您可以更改tempdb上的排序規則,但更改master數據庫上的排序規則是不是不可能的,但是它比更改用戶數據庫的排序規則更簡單。

有幾個自定義SQL腳本包含不同級別的邏輯來處理此問題,但我不會自動相信我的數據給他們中的任何人,而不生成腳本,讀取整個腳本,然後測試它徹底在測試環境中。

Microsoft文檔是here。下面是您需要運行以直接回答您的問題並更改默認數據庫排序規則的命令。 該操作將強制終止所有其他用戶到數據庫的所有活動連接並回滾所有未決事務。

USE [master] 
GO 
ALTER DATABASE [e_mail] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
ALTER DATABASE [e_mail] SET SINGLE_USER 
GO 
ALTER DATABASE [e_mail] COLLATE SQL_Latin1_General_CP1_CS_AS 
GO 
ALTER DATABASE [e_mail] SET MULTI_USER WITH ROLLBACK IMMEDIATE 
GO 
ALTER DATABASE [e_mail] SET MULTI_USER 
GO 

爲什麼運行SET SINGLE_USER和SET MULTI_USER兩次?僅僅因爲根據我的經驗,在第一次更改用戶模式後,服務器有時會發出錯誤。這可能是早期版本中的錯誤,硬件配置的問題或其他原因,但是我需要更改用戶模式並立即運行需要多年的腳本,單用戶模式,冗餘不會造成問題。