Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Laperuz Member Откуда: Сообщений: 9 |
Есть табличка "Users", и есть большое количество таблиц с FK на таблицу "Users" колонку "UserId". Задача в том, чтобы удалить запись из таблички Users. Предварительно все ссылки на UserId из других таблиц были зачищены. При попытке удаления записи из "Users" падает exception по foreign key, хотя проверка показывает что в этой табличке нет строк ссылающихся на таблицу "Users" колонку "UserId". |
13 июн 17, 10:49 [20559617] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Laperuz, плохо проверяли |
13 июн 17, 10:53 [20559633] Ответить | Цитировать Сообщить модератору |
Laperuz Member Откуда: Сообщений: 9 |
TaPaK, Конечно, всё возможно, но |
13 июн 17, 11:07 [20559673] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
что но? не в той схеме проверяли и тд, полностью ошибку и как проверяли |
||
13 июн 17, 11:09 [20559680] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Laperuz, полностью ошибку |
13 июн 17, 11:15 [20559717] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
13 июн 17, 11:19 [20559732] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Просто в ошибке слова "на таблицу Users колонку UserId.", а селекты вы делаете из совсем другой таблицы. |
||||
13 июн 17, 11:21 [20559736] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
SELECT * FROM dbo.User WHERE UserId = 'A7EA142B-383D-4293-B975-9DBCEB7E2656' |
||
13 июн 17, 11:22 [20559745] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
скрипт создания PSRnk я могу предположить что индексы битые, но не вероятней не туда ищите |
13 июн 17, 11:35 [20559811] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Laperuz Member Откуда: Сообщений: 9 |
TaPaK, индексы REBUILD. А что не туда ищу - согласен. И пытаюсь понять, куда смотреть? Если я убиваю FR, то удаление проходит. После этого убитый FK благополучно восстанавливается. Но с другими строками возникают ошибки по ссылкам на другие таблицы. |
13 июн 17, 11:46 [20559868] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Laperuz, типы полей в обоих таблицах? |
13 июн 17, 12:06 [20559959] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Laperuz, что-то прям сказка SELECT * FROM dbo.PSRnk P WHERE P.UserLastChanged LIKE 'A7EA142B-383D-4293-B975-9DBCEB7E2656' |
13 июн 17, 12:21 [20560006] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
или SELECT * FROM dbo.PSRnk WHERE UserLastChanged = CAST('A7EA142B-383D-4293-B975-9DBCEB7E2656' as uniqueidentifier) |
13 июн 17, 12:23 [20560014] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Вы в команде удаления из Users замените DELETE на SELECT, и добавьте джойн с PSRnk И будут видны проблемные записи. |
||
13 июн 17, 13:15 [20560184] Ответить | Цитировать Сообщить модератору |
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 | ![]() |