Транзакции на SQL сервере с оператором удаления - PullRequest
0 голосов
/ 03 августа 2020

Это моя задача: написать сценарий, включающий два оператора SQL, закодированных как транзакция, для удаления строки с идентификатором клиента 8 из таблицы Customers. Для этого необходимо сначала удалить все адреса этого клиента из таблицы Addresses.

Если эти операторы выполняются успешно, зафиксируйте изменения. В противном случае откатите изменения.

Моя проблема в том, что я получаю сообщение об ошибке, которое выглядит следующим образом:

Msg 547, Level 16, State 0, Line 9 Оператор DELETE вступил в конфликт с ограничением REFERENCE «FK__Orders__Customer__35BCFE0A». Конфликт произошел в базе данных «MyGuitarShop», таблица «dbo.Orders», столбец «CustomerID».

Мой код:

BEGIN TRAN;

DELETE FROM Addresses
WHERE CustomerID = 8;

DELETE FROM Customers
WHERE CustomerID = 8;

IF @@ROWCOUNT > 1
BEGIN
    ROLLBACK TRAN
    PRINT 'did not delete'
END
ELSE
BEGIN
    COMMIT TRAN;
END

Спасибо!

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Пока клиенты ссылаются на любую таблицу в вашей базе данных, вы не можете удалить ее. В соответствии с вашим сообщением об ошибке ограничения REFERENCE CustomerID = 8 имеет некоторый порядок в таблице «dbo.Orders», столбец «CustomerID» ссылается на клиентов, поэтому CustomerID = 8 не удаляется.

Сначала вам нужно чтобы удалить заказ из таблицы dbo.Orders для CustormerID = 8 или используйте

ON DELETE CASCADE 

в определении ограничения внешнего ключа.

0 голосов
/ 03 августа 2020

Вы пытаетесь удалить строку, когда на нее полагается другая строка. Это так называемая ссылочная целостность. Он предназначен для предотвращения появления потерянных строк.

Вам нужно будет удалить все строки, которые зависят от идентификатора клиента 8.

В данном случае это: -

DELETE FROM Orders WHERE CustomerID = 8

Но на вашем месте я бы, вероятно, прокомментировал, почему вы это делаете, или даже поговорил бы с тем, кто поставил вам задачу, спросить, приемлемо ли это.

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