Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
9-1179837261
evg123
2007-05-22 16:34
2009.05.17
Загрузка ЦП 100%


15-1236852850
b@v
2009-03-12 13:14
2009.05.17
ACCESS to MySQL


15-1236707812
PEAKTOP
2009-03-10 20:56
2009.05.17
Семинар по Delphi2009 в Москве и Питере


15-1234352551
Правильный$Вася
2009-02-11 14:42
2009.05.17
2 вопроса по установке D2009


3-1220794694
kaif
2008-09-07 17:38
2009.05.17
Вопросы по трриггерам MS SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский