Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 функция в триггере update(filed), - update(d)??  [new]
fibo
Member

Откуда:
Сообщений: 28
Всем привет!

как проверить, действительно ли было изменено значение в триггере
AFTER UPDATE (sql2008)

например есть таблица t1

idnamevalue
1red345
2white456
3black94
4yellow2345


если я пишу

update t1
set name='white',
value=7234
where id=1

и в триггере у меня стоит условие

if updated(name)
begin
....
end

то у меня обязятельно зайдет в это условие,
вопрос, можно ли при помощи каких-то дирректив типа SET ....ON/OFF
управлять этой настройкой (хочу чтобы не заходило, в updated(name) при апдейте на аналогичное значение!)?

есть конечно вариант:

if exists(
select * from inserted i 
inner join deleted d on i.id=d.id
where isnull(i.name,'')<>isnull(d.name,'')
begin
 ...
end
)

Но он громоздкий и недостаточно гибкий (с датами снова-же неудобно приводить)...

Спасибо!
20 ноя 09, 21:31    [7958906]     Ответить | Цитировать Сообщить модератору
 Re: функция в триггере update(filed), - update(d)??  [new]
fibo
Member

Откуда:
Сообщений: 28
сорри, опечатка

update t1
set name='white',
value=7234
where id=2
20 ноя 09, 21:32    [7958909]     Ответить | Цитировать Сообщить модератору
 Re: функция в триггере update(filed), - update(d)??  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
if exists(select id,name from inserted except select id,name from deleted)
begin
 ...
end;
20 ноя 09, 21:38    [7958912]     Ответить | Цитировать Сообщить модератору
 Re: функция в триггере update(filed), - update(d)??  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
if exists(select id,name from inserted except select id,name from deleted)
begin
 ...
end;
Забыл сказать: предполагается, что id - уникальное поле,
которое нельзя изменять (deleted.id=inserted.id для одной и той же записи таблицы).
20 ноя 09, 22:00    [7958936]     Ответить | Цитировать Сообщить модератору
 Re: функция в триггере update(filed), - update(d)??  [new]
fibo
Member

Откуда:
Сообщений: 28
iap,

да, согласен можно и воспользоваться разностью множеств except (>=sql2005)
аналог
if exists(
select * from inserted i
left join deleted d on i.id=d.id and i.name=d.name
where d.id is null
)
begin
 ...
end
вместо полного соединения inner join c дальнейшим сравнением значений

НО, для меня остается странной сама возможность апдейта значений на аналогичное, мне кажется это должно как-то управляться сиквелом, думаю нужно будет копнуть глубже в теорию...
21 ноя 09, 23:36    [7960391]     Ответить | Цитировать Сообщить модератору
 Re: функция в триггере update(filed), - update(d)??  [new]
iljy
Member

Откуда:
Сообщений: 8711
fibo,

видите ли в чем дело... Скуль вызывает триггер на КАЖДУЮ операцию, для которой он определен, независимо от того, сделела эта операция что-нибудь или нет. Т.е. если вы делаете delete t1 where id = 5 - триггер ON DELETE вызовется независимо от того, была строка с id=5 или нет. И это правильно, что скуль не пытается умничать (вообще это его выгодное отличие от некоторых других мелкософтовских прог ) и предоставляет разработчику (админу) самому решить, что делать в таком случае. То же самое справедливо и для отслеживания реально измененных строк. Благо вставить в начало триггера код вроде
if(exists(select * from inserted except select * from deleted))
 ...
не так уж сложно.

Можно конечно поговорить на тему
fibo

при помощи каких-то дирректив типа SET ....ON/OFF
управлять этой настройкой

, но чего нет - того нет, и лучше так чем наоборот ;)
21 ноя 09, 23:50    [7960407]     Ответить | Цитировать Сообщить модератору
 Re: функция в триггере update(filed), - update(d)??  [new]
fibo
Member

Откуда:
Сообщений: 28
"претензии" не к принципу работы самих триггеров, а к функции UPDATE(field) ... думаю было бы логично сделать еще и UPDATED(field)

(под UPDATED подразумевается изменение поля на значение отличное от первоначального)
23 ноя 09, 01:09    [7962035]     Ответить | Цитировать Сообщить модератору
 Re: функция в триггере update(filed), - update(d)??  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
fibo
"претензии" не к принципу работы самих триггеров, а к функции UPDATE(field) ... думаю было бы логично сделать еще и UPDATED(field)

(под UPDATED подразумевается изменение поля на значение отличное от первоначального)
Непонятно, какой смысл был бы в такой функции. Обновляться могут тысячи строк, но не во всех из них определённое поле обязано менять своё значение.
Про поле в целом можно только однозначно сказать, задано оно в списке SET UPDATEа или нет.
Что и делает UPDATE(). Практически бесполезно, зато логически безупречно.
23 ноя 09, 09:04    [7962307]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить