2010-11-08 158 views
1

我們在嘗試將所有用戶更新爲SQL Server中的小寫用戶名時出現問題。我們正在這樣做,以支持我們的應用程序的最近更改。具體地,下面的查詢與FK約束錯誤失敗上的另一表的引用[用戶]。[用戶名]外鍵SQL Server大小寫敏感性

Update [User] 
Set [Username] = 'someuser' where [username] = 'SomeUser' 

用戶「SomeUser是否」並不在外部表已經存在與殼體匹配「SomeUser是否」。此時FK未設置爲「更新級聯」。我打算走這條路,但有不少參考文獻[User]。[用戶名]專欄,當我開始沿着這條路走時,有點混亂。另外,我寧願處理根本原因 - 爲什麼SQL在Key上強制匹配?

我不是最好的SQL Server的內部,但我已經cheched使用另一個SO問題的指導COLLATION(http://stackoverflow.com/questions/1411161/sql-server-check-case靈敏度),我得到了這些結果。

SELECT SERVERPROPERTY('COLLATION') 
=> SQL_Latin1_General_CP1_CI_AS 

SELECT DATABASEPROPERTYEX('MyDB', 'Collation') SQLCollation; 
=> SQL_Latin1_General_CP1_CI_AS 

select table_name, column_name, collation_name 
from information_schema.columns 
where table_name = 'User' 
=> User Username SQL_Latin1_General_CP1_CI_AS 

select table_name, column_name, collation_name 
from information_schema.columns 
where table_name = 'ForeignTable' 
=> ForeignTable User_Username SQL_Latin1_General_CP1_CI_AS 

我不知道要檢查什麼。希望有人有一個解決方案。我很高興能夠檢查SQL中的任何設置(儘管您可能必須引導我到他們在Management Studio中的位置,或者運行查詢來獲取它們),或者如果我沒有給出足夠的詳細信息,請提供任何其他詳細信息信息。

UPDATE:錯誤的請求

Msg 547, Level 16, State 0, Line 4 
The UPDATE statement conflicted with the REFERENCE constraint "FK_ForeignTable_User". The conflict occurred in database "MyDB", table "dbo.ForeignTable", column 'User_Username'. 
The statement has been terminated. 
+3

是什麼*確切*錯誤請? – gbn 2010-11-08 20:13:19

+0

我更新了錯誤的主要帖子。據我所知,這只是一個基本的FK約束錯誤。 – WesleyJohnson 2010-11-08 20:23:47

回答

2

基於這樣的事實,所有的排序規則一致,再一個原因可能是觸發射擊更新。這就是爲什麼確切的錯誤信息很重要。

例如,您是否有審計觸發器試圖將更新記錄到區分大小寫的列中?我說過,我從來沒有試圖在2種不同的排序規則之間創建一個FK(我現在無法測試):不知道它是否可行。

一個事實的方式來測試SomeUser的VS SomeUser的將是一個簡單的GROUP BY:你得到每值,或者一個一個計數兩個值

編輯:檢查是否有尾隨空格...

+1

如果排序規則與其引用的列不匹配(列'aaa'與引用列'bbb.ccc'的排序規則不同) – Andomar 2010-11-08 20:29:21

+0

@Andomar:謝謝,懷疑它可能會失敗 – gbn 2010-11-08 20:30:27

+0

由於[用戶名] [用戶]中的列是不同的,我無法在該特定的表上運行該測試。然而,只需創建一個帶有一列的表變量(Username varchar(50)),插入'SomeUser'和'someuser'並在該表上運行Group By [用戶名]將爲兩個值生成1個計數。換句話說,它將'SomeUser'和'someuser'視爲同一件事。 – WesleyJohnson 2010-11-08 20:41:30