Чувствительность к регистру SQL Server во внешнем ключе - PullRequest
1 голос
/ 08 ноября 2010

У нас возникают проблемы при попытке обновить всех наших пользователей строчными именами пользователей в SQL Server. Мы делаем это для поддержки последних изменений в нашем приложении. В частности, следующий запрос не выполняется с ошибкой ограничения FK для другой таблицы, которая ссылается на [Пользователь]. [Имя пользователя]

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

Пользователь 'someuser' уже существует во внешней таблице, и регистр соответствует 'SomeUser'. FK не установлен в Каскад при обновлении в данный момент. Я собирался пойти по этому пути, но есть довольно много ссылок на столбец [Пользователь]. [Имя пользователя], и когда я начал идти по этому пути, это было немного грязно. Кроме того, я бы предпочел разобраться с основной причиной - почему SQL обеспечивает соответствие регистра по ключу?

Я не лучший с внутренними компонентами SQL Server, но я выбрал COLLATION, руководствуясь другим вопросом SO (/940277/sql-server-proveryaet-chuvstvitelnost-k-registru), и я получил эти результаты.

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 или запросе, чтобы выполнить их) или предоставить дополнительную информацию, если я недостаточно дал Информация.

ОБНОВЛЕНИЕ: ошибка в соответствии с запросом

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.

1 Ответ

2 голосов
/ 08 ноября 2010

Исходя из того, что все параметры сортировки совпадают, одной из причин может быть срабатывание триггера при обновлении.Вот почему важно точное сообщение об ошибке.

Например, у вас есть триггер аудита, пытающийся записать обновление в чувствительный к регистру столбец?создать FK между двумя разными параметрами сортировки (сейчас я не могу проверить): не уверен, что это сработает.

Один из реальных способов проверки SomeUser и someuser - это простой GROUP BYодин счетчик для каждого значения или один для обоих значений

Правка: проверка пробелов в конце ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...