Конференция "Базы" » Вопросы по трриггерам MS SQL [MSSQL]
 
  • kaif © (07.09.08 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 © (07.09.08 17:57) [1]
    Вопрос снят. Похоже я просто не нашел в справке то место, где сказано, что старые значения лежат в наборе deleted.
    :)
  • Германн © (08.09.08 01:07) [2]

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

    Правильная идея. Сформулировать вопрос на форум и глядишь сам сразу найдешь ответ. Тем более, что в ночь на понедельник очень мала вероятность того, что в топик полезет неизвестно кто да ещё с грязными руками.
    :)
  • Кстати (08.09.08 12:31) [3]
    Описанный в вопросе код не будет корректно работать с двумя и более обновленными строчками за транзакцию.
  • Anatoly Podgoretsky © (08.09.08 22:54) [4]
    kaif ©   (07.09.08 17:57) [1]
    А теперь посмотри триггер INSTEAD OF совсем не будут равны inserted и сама таблица. Тут надо просто понять идеологию.
    inserted и deleted это виртуальные таблицы.
    А то что не так как в ИБ, так и СУБД другая, посмотри еще и на прочие у них тоже иначе. Это нормально. При переходе на другую СУБД надо понимать, что это другой монастырь, а про старый лучше забыть.
 
Конференция "Базы" » Вопросы по трриггерам MS SQL [MSSQL]
Есть новые Нет новых   [134435   +34][b:0][p:0]