powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ограничение внешнего ключа
4 сообщений из 4, страница 1 из 1
Ограничение внешнего ключа
    #39882477
sqlfool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, возник вопрос, где ошибка.
Вот код:

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 пишет, что проблемы с ключом. Каскадное удаление и другие фичи не предлагать, так как нельзя это использовать в задании)
...
Рейтинг: 0 / 0
Ограничение внешнего ключа
    #39882482
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlfool
Код: sql
1.
2.
3.
ALTER TRIGGER [dbo].[Deleteworker] 
ON [dbo].[worker]
for delete


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

Нужно перехватывать удаление с помощью INSTEAD OF:
Код: sql
1.
2.
3.
ALTER TRIGGER [dbo].[Deleteworker] 
ON [dbo].[worker]
INSTEAD OF delete
...
Рейтинг: 0 / 0
Ограничение внешнего ключа
    #39882483
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlfoolПри удалении из таблицы workers пишет, что проблемы с ключом.Желательно копировать сообщение об ошибке, а не передавать своими словами.

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

PS сам триггер ужасен, что вы рассчитываете увидеть в переменной @YEAR, если SELECT deleted.year from deleted вернёт 2 разных года?
...
Рейтинг: 0 / 0
Ограничение внешнего ключа
    #39882607
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlfool,

советую вам никогда в триггере не декларировать скалярные переменные
для присвоения им значения из deleted или inserted.
В этих псевдотаблицах может быть миллиард записей!
Как вы планируете разместить миллиард значений в одной скалярной переменной??
Надо просто пользоваться inserted и deleted как обычными таблицами. Никаких переменных!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ограничение внешнего ключа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]