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