Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
Laperuz
Member

Откуда:
Сообщений: 9
Есть табличка "Users", и есть большое количество таблиц с FK на таблицу "Users" колонку "UserId".
Задача в том, чтобы удалить запись из таблички Users. Предварительно все ссылки на UserId из других таблиц были зачищены.
При попытке удаления записи из "Users" падает exception по foreign key, хотя проверка показывает что в этой табличке нет строк ссылающихся на таблицу "Users" колонку "UserId".
13 июн 17, 10:49    [20559617]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Laperuz,

плохо проверяли
13 июн 17, 10:53    [20559633]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
Laperuz
Member

Откуда:
Сообщений: 9
TaPaK,
Конечно, всё возможно, но
13 июн 17, 11:07    [20559673]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Laperuz
TaPaK,
Конечно, всё возможно, но

что но? не в той схеме проверяли и тд, полностью ошибку и как проверяли
13 июн 17, 11:09    [20559680]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
Laperuz
Member

Откуда:
Сообщений: 9
...
Конечно, всё возможно, но

SELECT * FROM dbo.PSRnk P WHERE P.UserLastChanged = 'A7EA142B-383D-4293-B975-9DBCEB7E2656'
SELECT * FROM dbo.CMData C WHERE C.UserId = 'A7EA142B-383D-4293-B975-9DBCEB7E2656'

Первый запрос не вернул ничего. Второй - 40 записей.
Диагностика идёт на dbo.PSRnk.
Что не так? Как и где искать?
13 июн 17, 11:12    [20559703]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Laperuz,
полностью ошибку
13 июн 17, 11:15    [20559717]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
TaPaK
Laperuz,
полностью ошибку
... и структуру таблиц с FK, где видно, что поле UserLastChanged в таблице dbo.PSRnk ссылается на поле UserId в таблице dbo.CMData
13 июн 17, 11:19    [20559732]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
Laperuz
Member

Откуда:
Сообщений: 9
TaPaK,

The DELETE statement conflicted with the REFERENCE constraint "FK_PSRnk_User". The conflict occurred in database "DB", table "dbo.PSRnk", column 'UserLastChanged'.

Она чётко указывает схему и таблицу.
Кстати, сервер 2016
13 июн 17, 11:20    [20559734]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
alexeyvg
TaPaK
Laperuz,
полностью ошибку
... и структуру таблиц с FK, где видно, что поле UserLastChanged в таблице dbo.PSRnk ссылается на поле UserId в таблице dbo.CMData

Просто в ошибке слова "на таблицу Users колонку UserId.", а селекты вы делаете из совсем другой таблицы.
13 июн 17, 11:21    [20559736]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Laperuz
TaPaK,

The DELETE statement conflicted with the REFERENCE constraint "FK_PSRnk_User". The conflict occurred in database "DB", table "dbo.PSRnk", column 'UserLastChanged'.

Она чётко указывает схему и таблицу.
Кстати, сервер 2016
Ну и теперь
SELECT * FROM dbo.User WHERE UserId = 'A7EA142B-383D-4293-B975-9DBCEB7E2656'
13 июн 17, 11:22    [20559745]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
скрипт создания PSRnk
я могу предположить что индексы битые, но не вероятней не туда ищите
13 июн 17, 11:35    [20559811]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
Laperuz
Member

Откуда:
Сообщений: 9
alexeyvg,

Этот SELECT, естественно, вернул одну запись, которую как раз и нужно удалить.
А ругается другая таблица, в котрой есть FR:

ALTER TABLE [dbo].PSRnk] WITH CHECK ADD CONSTRAINT [FK_PSRnk_User] FOREIGN KEY([UserLastChanged])
REFERENCES [dbo].[Users] ([UserId])

и которая говорит, что не могу удалить из Users, т.к. есть записи в PSRnk. А их там - нет!
13 июн 17, 11:40    [20559836]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Laperuz,

не уверен, что даст
SELECT * FROM dbo.PSRnk P WITH INDEX(0) WHERE P.UserLastChanged = 'A7EA142B-383D-4293-B975-9DBCEB7E2656'
ну и
DBCC CHECKTABLE('dbo.PSRnk')
13 июн 17, 11:44    [20559857]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
Laperuz
Member

Откуда:
Сообщений: 9
TaPaK,

индексы REBUILD.
А что не туда ищу - согласен.
И пытаюсь понять, куда смотреть?

Если я убиваю FR, то удаление проходит. После этого убитый FK благополучно восстанавливается.
Но с другими строками возникают ошибки по ссылкам на другие таблицы.
13 июн 17, 11:46    [20559868]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
Laperuz
Member

Откуда:
Сообщений: 9
TaPaK,

да, проверял. И ещё раз

DBCC results for 'PSRnk'.
There are 1725529 rows in 26636 pages for object "PSRnk".
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
13 июн 17, 11:49    [20559880]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Laperuz,

типы полей в обоих таблицах?
13 июн 17, 12:06    [20559959]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
Laperuz
Member

Откуда:
Сообщений: 9
TaPaK,

CREATE TABLE [dbo].[Users](
[UserId] [uniqueidentifier] NOT NULL,
...

CREATE TABLE [dbo].PSRnk
...
[UserLastChanged] [uniqueidentifier] NOT NULL,
...
13 июн 17, 12:18    [20559996]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Laperuz,

что-то прям сказка

SELECT * FROM dbo.PSRnk P WHERE P.UserLastChanged LIKE 'A7EA142B-383D-4293-B975-9DBCEB7E2656'
13 июн 17, 12:21    [20560006]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
или

SELECT * FROM dbo.PSRnk	WHERE UserLastChanged	= CAST('A7EA142B-383D-4293-B975-9DBCEB7E2656' as uniqueidentifier)
13 июн 17, 12:23    [20560014]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Laperuz
alexeyvg,

Этот SELECT, естественно, вернул одну запись, которую как раз и нужно удалить.
А ругается другая таблица, в котрой есть FR:

ALTER TABLE [dbo].PSRnk] WITH CHECK ADD CONSTRAINT [FK_PSRnk_User] FOREIGN KEY([UserLastChanged])
REFERENCES [dbo].[Users] ([UserId])

и которая говорит, что не могу удалить из Users, т.к. есть записи в PSRnk. А их там - нет!

Вы в команде удаления из Users замените DELETE на SELECT, и добавьте джойн с PSRnk
И будут видны проблемные записи.
13 июн 17, 13:15    [20560184]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при удалении из таблицы. Несуществующая ссылка FK  [new]
Laperuz
Member

Откуда:
Сообщений: 9
Ключевые слова оказались: "...не туда ищите ", "SQL Server 2016", "большое количество таблиц с FK на таблицу "Users".
Ошибка возникает при Compatibility Level = 130 (SQL Server 2016). Всё отрабатывает при Compatibility Level = 120 (SQL Server 2014).
Вообще-то, похоже на bug. Можно посмотреть https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/05/23/query-optimizer-additions-in-sql-server/.
Большое спасибо за обсуждение и поддержку!
14 июн 17, 10:53    [20562760]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить