Почему бы вам не протестировать изменяющиеся столбцы с помощью IF UPDATE(Column1,Column2,...)
Это позволит вам узнать, изменился ли какой-либо из интересующих вас столбцов. См. http://msdn.microsoft.com/en-us/library/ms187326.aspx для получения подробной информации о UPDATE()
function.
Вы также сможете использовать его, если PK был изменен, тогда как сравнение между inserted
и deleted
способом, которым вы пытаетесь это сделать, пропустит измененияк ПК.
Решение, включающее проверку неравенства всех полей, не получится, если вы не SET ANSI_NULLS OFF
перед сравнением.
Например:
create table table1 ( a varchar(4), b varchar(4) null)
create table table2 ( a varchar(4), b varchar(4) null)
go
insert into table1 ( a, b ) select 'asdf', null
insert into table2 ( a, b ) select 'asdf', 'zzzz'
--Expect no results
select *
from table1
inner join table2
on a.a = b.a
where a.b <> b.b
set ansi_nulls off
--Expect 1 result
select *
from table1
inner join table2
on a.a = b.a
where a.b <> b.b
ИзКонечно, вы могли бы проводить дополнительные тесты, вместо того, чтобы использовать опцию ansi_nulls
, но это становится особенно безумным, если вы делаете это со многими полями.Также: вы должны set ansi_nulls off
до создания триггера - вы не можете включать и выключать его внутри триггера, поэтому все это должно иметь одинаковую настройку ansi_nulls
.