Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.17;
Скачать: CL | DM;

Вниз

Вопросы по трриггерам MS SQL   Найти похожие ветки 

 
kaif ©   (2008-09-07 17:38) [0]

Читаю BOL от Microsoft по триггерам. Не сказал бы, что эта справка что-либо мне проясняет.
После триггеров IB с их ясной логикой понять что-либо весьма трудно.

Я вот пытаюсь , например, в триггере сравнить старое и новое значение поля.  В IB я бы просто сравнил OLD.NAKL_NO и NEW.NAKL_NO. Причем я мог бы сделать это как в триггере BEFORE UPDATE, так и в триггере AFTER UPDATE. В MSSQL все триггеры работают как BEFORE что-нибудь, причем ПОСЛЕ проверки ссылочной целостности. Ну допустим. К тому же они запускаются не один раз на каждую строку, а сразу на всю  группу модифицируемых строк. Ну хорошо, может это и к лучшему. Чтобы работать с группой строк мне дают переменную inserted. Причем в нее попадают данные как при INSERT, так и при UPDATE. Прекрасно! Причем судя по примерам в этой таблице inserted лежат новые данные. Я, обрадованный, пытаюсь таким способом решить свою задачу: сравнить два значения. Чтобы увидеть, что получается, я завел табличку MSG, куда пишу результаты своих исследований.

Я предполагаю, что в наборе inserted значение колонки должно быть новым, а в самой таблице - старым. Ну так мне кажется по логике. И вот я проверяю и убеждаюсь, что эти оба значения новые:

CREATE TRIGGER TRI_NAKL_UPDATE
ON NAKL FOR UPDATE
AS
 declare
   @NewNaklNo varchar(20),
   @OldNaklNo varchar(20)
 select
   @NewNaklNo = I.nakl_no,
   @OldNaklNo = N.nakl_no
 from  
   inserted I, nakl N
 where
   I.id = N.id
 insert into msg(aname) values (@OldNaklNo +"->"+ @NewNaklNo)

Возникает вопрос. Как мне найти старое значение? Или его мне уже не найти никак? Какой смысл мне в триггере ON UPDATE давать было целый набор Inserted со всеми полями, в которых лежит то же самое, что уже и в самой таблице?

Проясните, люди добрые.


 
kaif ©   (2008-09-07 17:57) [1]

Вопрос снят. Похоже я просто не нашел в справке то место, где сказано, что старые значения лежат в наборе deleted.
:)


 
Германн ©   (2008-09-08 01:07) [2]


> kaif ©   (07.09.08 17:57) [1]
>
> Вопрос снят.

Правильная идея. Сформулировать вопрос на форум и глядишь сам сразу найдешь ответ. Тем более, что в ночь на понедельник очень мала вероятность того, что в топик полезет неизвестно кто да ещё с грязными руками.
:)


 
Кстати   (2008-09-08 12:31) [3]

Описанный в вопросе код не будет корректно работать с двумя и более обновленными строчками за транзакцию.


 
Anatoly Podgoretsky ©   (2008-09-08 22:54) [4]

kaif ©   (07.09.08 17:57) [1]
А теперь посмотри триггер INSTEAD OF совсем не будут равны inserted и сама таблица. Тут надо просто понять идеологию.
inserted и deleted это виртуальные таблицы.
А то что не так как в ИБ, так и СУБД другая, посмотри еще и на прочие у них тоже иначе. Это нормально. При переходе на другую СУБД надо понимать, что это другой монастырь, а про старый лучше забыть.



Страницы: 1 вся ветка

Текущий архив: 2009.05.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
15-1237371996
DmitryFox
2009-03-18 13:26
2009.05.17
Delphi 2009 и Delphi Prism


15-1236754505
Дмитрий С
2009-03-11 09:55
2009.05.17
Размер EXE в зависимости от версии dephi


15-1236072640
Дукам
2009-03-03 12:30
2009.05.17
Менеджер ресурсов в Дельфи 7


3-1220954949
Forbi
2008-09-09 14:09
2009.05.17
Количество строк после селективного запроса


15-1236720610
Юрий
2009-03-11 00:30
2009.05.17
С днем рождения ! 11 марта 2009 среда