Главная страница
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.011 c
15-1237152645
Юрий
2009-03-16 00:30
2009.05.17
С днем рождения ! 16 марта 2009 понедельник


2-1238824270
XTasy
2009-04-04 09:51
2009.05.17
StringGrid и событие OnMouseMove


2-1238744228
olegteacher
2009-04-03 11:37
2009.05.17
Очистка Image


2-1238587245
Xmen
2009-04-01 16:00
2009.05.17
Delphi+FireBird Book


4-1210079518
bon
2008-05-06 17:11
2009.05.17
Terminal server