I have an on update trigger in SQL Server 2008. I only need to perform the trigger action if certain columns have been modified. Thus I’d like to check what has changed.
T-SQL offers an “if update( columnName )” construct. However, if many rows have been updated and only a single one of them has the particular column value changed “if update()” will have to return true. This’ll make me perform the trigger action for far more rows than required.
So instead of using “if update()” I thought I’d just join the virtual deleted and inserted tables (the rows before and after update) and compare the relevant columns myself. However, how can I join the two tables? I cannot use the table’s primary key since that may have been modified by the update. The only thing I can think of is joining by row_number(), i.e. implicit table ordering. This feels very wrong though and I don’t know whether SQL Server actually offers any guarantuees that rows in inserted are ordered the same as in deleted.
With your design (that allows changing primary keys) it seems very hard to build a consistent logic.
Say, you have this table:
and issue this operation:
which updates both records but leaves the table as this:
, which from relational point of view is similar to not changing the table at all.
The whole point of the primary keys is that they never change.