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

Откуда:
Сообщений: 89
Здравствуйте.
Как правильно написать триггер для DELETE, что при удалении записей из одной таблицы удалялись из другой тоже.
Написал вот такой код:

CREATE TRIGGER TSS_RNVE_MOVE_DEL ON dbname.table1
FOR DELETE
AS
SET NOCOUNT ON;
DECLARE @idref int;
SELECT @idref = ID_REFERENCE
FROM deleted;
DELETE FROM table2
WHERE table2.ID_REFERENCE = @idref;

Но он удаляет лишь одну строку.

Хотел написать:

CREATE TRIGGER TSS_RNVE_MOVE_DEL ON dbname.table1
FOR DELETE
AS
SET NOCOUNT ON;
DELETE FROM table2
WHERE table2.ID_REFERENCE = deleted.ID_REFERENCE;

но СКЛ не понимает что за поле deleted.ID_REFERENCE

Помогите пожалуйста правильно написать синтаксис
28 июл 12, 16:34    [12929597]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
step_ks
Member

Откуда:
Сообщений: 936
DELETE t2 FROM table2 t2, deleted d
WHERE t2.ID_REFERENCE = d.ID_REFERENCE;
28 июл 12, 17:14    [12929639]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
qwerty112
Guest
автор
CREATE TRIGGER TSS_RNVE_MOVE_DEL ON dbname.table1
FOR DELETE
AS
SET NOCOUNT ON;
DELETE FROM table2
WHERE table2.ID_REFERENCE = deleted.ID_REFERENCE;

но СКЛ не понимает что за поле deleted.ID_REFERENCE

DELETE table2
FROM table2 inner join deleted
on table2.ID_REFERENCE = deleted.ID_REFERENCE;
28 июл 12, 17:16    [12929641]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
elshad82
Member

Откуда:
Сообщений: 89
qwerty112
автор
CREATE TRIGGER TSS_RNVE_MOVE_DEL ON dbname.table1


DELETE table2
FROM table2 inner join deleted
on table2.ID_REFERENCE = deleted.ID_REFERENCE;


Нет это не вариант.
Нашел как это сделать:

CREATE TRIGGER DELTRIG ON table1
FOR DELETE
AS
SET NOCOUNT ON;
DELETE
FROM table2
WHERE idref IN (SELECT idref FROM deleted);

Но это работает когда я связываю таблицы по одному полю. А как в данном синтаксисе связать по двум полям. То есть первичный ключ это связка двух полей

table2.idref = deleted.idref
AND table2.linenum = deleted.linenum

Как связать по двум полям?
28 июл 12, 22:01    [12930090]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
elshad82
Как связать по двум полям?


DELETE
FROM table2 t
WHERE EXISTS (SELECT * FROM deleted d WHERE d.id1 = t.id1 AND d.id2 = t.id2);
28 июл 12, 22:04    [12930101]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
elshad82
Member

Откуда:
Сообщений: 89
Спасибо за предложенные варианты

DELETE t2 FROM table2 t2, deleted d
WHERE t2.ID_REFERENCE = d.ID_REFERENCE;

DELETE
FROM table2 t
WHERE EXISTS (SELECT * FROM deleted d WHERE d.id1 = t.id1 AND d.id2 = t.id2);

Благодарю.
Все работает. Еще раз протестирую
28 июл 12, 22:19    [12930165]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Да, да. Даже никто не упомянул автоматическое каскадное удаление (FOREIGN KEY, ON DELETE CASCADE).
При этом не все знают синтаксис UPDATE, не знают что такое JOIN (и когда его нужно писать) и не пишут схемы в именах объектов.

Позор всем вам ....кодерам.
29 июл 12, 03:19    [12930595]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
qwerty112
Guest
Mnior
Да, да. Даже никто не упомянул автоматическое каскадное удаление (FOREIGN KEY, ON DELETE CASCADE).


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

а "по-причине", дык не важно :
- может - нельзя там "ON DELETE CASCADE" - цикл, например, есть (которых быть не дОлжно, - да-да !)
- просто, для общего самообразования интересуется
- "шоб отличатся", наконец


Mnior
При этом не все знают синтаксис UPDATE,

про UPDATE - шутка зачётная ! )
29 июл 12, 09:24    [12930712]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
elshad82
Member

Откуда:
Сообщений: 89
Mnior
Да, да. Даже никто не упомянул автоматическое каскадное удаление (FOREIGN KEY, ON DELETE CASCADE).
При этом не все знают синтаксис UPDATE, не знают что такое JOIN (и когда его нужно писать) и не пишут схемы в именах объектов.

Позор всем вам ....кодерам.


В моем случае INNER JOIN не нужен. А что касательно UPDATE-a , тут ваши знания пригодились бы.
Написать INSERT и DELETE я могу для своей задачи (благодаря форуму). В с UPDATE незадача. Якобы такой код должен был сработать:

CREATE TRIGGER UPDTRIG ON dbname.dbo.table1
FOR UPDATE
AS
SET NOCOUNT ON
;
UPDATE dbname.dbo.table2
SET table2.col1 = inserted.col1,
table2.col2 = inserted.col2,
table2.col3 = inserted.col3,
WHERE table2.col5 = inserted.col5
AND table2.col6 = inserted.col6;

Но так как inserted нигде не объявлен то СКЛ не понимает что это за объект. Как в данном случае сделать правильно UPDATE?
29 июл 12, 14:07    [12931142]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
qwerty112
Guest
elshad82
В моем случае INNER JOIN не нужен. А что касательно UPDATE-a , тут ваши знания пригодились бы.

вот потому, что ты "дупля не отбиваеш", что INNER JOIN можно использовать и в DELETE и в UPDATE - ты и пишеш такую дурню ("INNER JOIN не нужен")

"А что касательно UPDATE-a" - иди читай ссылку Mnior,
в частности про
UPDATE  ...
set ...
from  ...


зы
и почему нельзя использовать каскадные обновления/удаления сначала скажи, "№% !

ззы
Mnior, я прошу прощения про замечание про UPDATE ...,
но откуда вы это знали ??!
29 июл 12, 14:17    [12931174]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
elshad82
Но так как inserted нигде не объявлен то СКЛ не понимает что это за объект. Как в данном случае сделать правильно UPDATE?
Ясно как - FROM + JOIN написать.
Причём, если задать алиас для изменяемой таблицы во FROMе (очень рекомендуется!),
то после UPDATE надо будет писать алиас, а не имя таблицы.
29 июл 12, 14:17    [12931177]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
elshad82
Member

Откуда:
Сообщений: 89
qwerty112
elshad82
В моем случае INNER JOIN не нужен. А что касательно UPDATE-a , тут ваши знания пригодились бы.

вот потому, что ты "дупля не отбиваеш", что INNER JOIN можно использовать и в DELETE и в UPDATE - ты и пишеш такую дурню ("INNER JOIN не нужен")

"А что касательно UPDATE-a" - иди читай ссылку Mnior,
в частности про
UPDATE  ...
set ...
from  ...


зы
и почему нельзя использовать каскадные обновления/удаления сначала скажи, "№% !

ззы
Mnior, я прошу прощения про замечание про UPDATE ...,
но откуда вы это знали ??!


Еще до каскадного удаления/обновления не дорос. Для текущей задачи мне хватило варианта:
DELETE t2 FROM table2 t2, deleted d
WHERE t2.ID_REFERENCE = d.ID_REFERENCE;

Так что и UPDATE хотелось бы написать таким же синтаксисом. Не используя INNER JOIN. Объявив алиасы для таблиц table2 и inserted. Что то типа:
UPDATE table2 t2, inserted ins
SET t2.col1 = ins.col1
WHERE t2.col5 = ins.col5

Это возможно?

Я пока еще на стадии изучения T-SQL, и пройдет время пока буду более менее обращатся языком. Но задача должна быть решена к кратчайшие сроки. Поэтому я тут
29 июл 12, 14:27    [12931199]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
elshad82
Member

Откуда:
Сообщений: 89
ссылку про UPDATE прочитал. Но там общая информация. Нет примеров для разных сценариев. Например как использовать в триггере, если связываем таблицы по двум/трем полям и т.д.
29 июл 12, 14:36    [12931232]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
qwerty112
Guest
elshad82
ссылку про UPDATE прочитал. Но там общая информация. Нет примеров для разных сценариев. Например как использовать в триггере, если связываем таблицы по двум/трем полям и т.д.


>> как использовать в триггере

джойну - пофиг как называется конструкция в которую его запихали

>> если связываем таблицы по двум/трем полям

джойну - пофиг по скольки полям идёт связь
29 июл 12, 14:45    [12931250]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
elshad82
Member

Откуда:
Сообщений: 89
Нашел решение тут
https://www.sql.ru/forum/actualthread.aspx?tid=957049

Все очень просто:

UPDATE table2
SET col1=(SELECT col1 FROM inserted),
SET col2=(SELECT col2 FROM inserted)
WHERE col5=(select col5 from inserted)
29 июл 12, 14:45    [12931253]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
qwerty112
Guest
elshad82
Нашел решение тут
https://www.sql.ru/forum/actualthread.aspx?tid=957049

Все очень просто:

UPDATE table2
SET col1=(SELECT col1 FROM inserted),
SET col2=(SELECT col2 FROM inserted)
WHERE col5=(select col5 from inserted)

такое "решение" - ты уже находил для DELETE
тут - 12929597

автор
Но он удаляет лишь одну строку.

"жалоба", правда, будет другая ...
29 июл 12, 14:48    [12931257]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
elshad82
Member

Откуда:
Сообщений: 89
qwerty112
elshad82
Нашел решение тут
https://www.sql.ru/forum/actualthread.aspx?tid=957049

Все очень просто:

UPDATE table2
SET col1=(SELECT col1 FROM inserted),
SET col2=(SELECT col2 FROM inserted)
WHERE col5=(select col5 from inserted)

такое "решение" - ты уже находил для DELETE
тут - 12929597

автор
Но он удаляет лишь одну строку.

"жалоба", правда, будет другая ...


Почему одну? Должен удалять строки которые соответствуют условию WHERE
29 июл 12, 14:50    [12931265]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно написать триггер для DELETE?  [new]
step_ks
Member

Откуда:
Сообщений: 936
elshad82
qwerty112
пропущено...

такое "решение" - ты уже находил для DELETE
тут - 12929597

пропущено...

"жалоба", правда, будет другая ...


Почему одну? Должен удалять строки которые соответствуют условию WHERE
Перестаньте заниматься ерундой и почитайте про join или хотя бы про from. Ваш запрос вообще вылетит по эксепшену.
29 июл 12, 22:01    [12932037]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить