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

Откуда:
Сообщений: 9
Добрый день, возник вопрос, где ошибка.
Вот код:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Deleteworker]
ON [dbo].[worker]
for delete
as
DECLARE @YEAR INT;
SET @YEAR = (SELECT deleted.year from deleted)
DECLARE @ID INT;
SET @ID = (SELECT deleted.id from deleted)

update tools
set owner_id = null where tools.owner_id = @ID

if @YEAR > 20
begin
delete tools where tools.owner_id = @ID
end


При удалении из таблицы workers пишет, что проблемы с ключом. Каскадное удаление и другие фичи не предлагать, так как нельзя это использовать в задании)

К сообщению приложен файл. Размер - 82Kb
28 окт 19, 21:23    [22004587]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение внешнего ключа  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 498
sqlfool
ALTER TRIGGER [dbo].[Deleteworker] 
ON [dbo].[worker]
for delete

Этот триггер не выполняется, так как FOR DELETE - это выполнение триггера после удаления. А удаление завершается ошибкой, то есть не выполняется.

Нужно перехватывать удаление с помощью INSTEAD OF:
ALTER TRIGGER [dbo].[Deleteworker] 
ON [dbo].[worker]
INSTEAD OF delete
28 окт 19, 21:34    [22004596]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение внешнего ключа  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31332
sqlfool
При удалении из таблицы workers пишет, что проблемы с ключом.
Желательно копировать сообщение об ошибке, а не передавать своими словами.

А триггер срабатывает после удаления, соответственно, ключи проверяются до выполнения триггера.

PS сам триггер ужасен, что вы рассчитываете увидеть в переменной @YEAR, если SELECT deleted.year from deleted вернёт 2 разных года?
28 окт 19, 21:35    [22004597]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение внешнего ключа  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
sqlfool,

советую вам никогда в триггере не декларировать скалярные переменные
для присвоения им значения из deleted или inserted.
В этих псевдотаблицах может быть миллиард записей!
Как вы планируете разместить миллиард значений в одной скалярной переменной??
Надо просто пользоваться inserted и deleted как обычными таблицами. Никаких переменных!
29 окт 19, 10:56    [22004834]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить