Форум: "Базы";
Текущий архив: 2009.05.17;
Скачать: [xml.tar.bz2];
ВнизВопросы по трриггерам 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c