Проверка, что-то изменилось в триггере - PullRequest
1 голос
/ 16 августа 2010

Мне необходимо отслеживать подмножество полей в таблице и выполнять задачу при изменении одного из них.

Я использую триггер для обновления таблицы, который затем просматривает изменения какследующим образом:

-- join the deleted and inserted to get a full list of rows
select * into #tmp from (select * from inserted union select * from deleted) un
-- select a count of differing rows, > 1 means something is different
select distinct count(*) from #tmp

Это нормально, и подсчет 2 или более означает, что что-то меняется в однострочных обновлениях.Проблема в том, что если я делаю многострочное обновление, то это ломается.

Есть ли способ заставить это работать для многострочного обновления или мне нужно полностью попробовать другой подход.

Ответы [ 2 ]

1 голос
/ 16 августа 2010

Вы можете сделать что-то вроде этого (синтаксис полностью не проверен)

IF NOT UPDATE(col) 
 RETURN

SELECT inserted.key, inserted.col as i_col,  deleted.col as d_col
INTO #interestingrows
 FROM inserted JOIN deleted on inserted.key = deleted.key 
    and inserted.col <> deleted.col /*If col is nullable cater for that as well*/

IF @@ROWCOUNT=0
 RETURN

 /*Process contents of  #interestingrows*/
0 голосов
/ 17 августа 2010

Я получил довольно простое решение. Я написал дополнительный цикл вокруг проверки, которая выполняла проверку каждой вставленной строки.

        -- get a list of updated line id's
        select field1 as id into #loop from inserted 



    -- loop through all the id's and do a compare
    while (select count(*) from #loop) > 0 begin
        select top 1 @id = id from #loop

        select * into #tmp from (select * from inserted where field1 = @id union 
                                 select * from deleted where field1 = @id) un

        -- do a select ditinct to count the differing lines.
        if (select distinct count(*) from #tmp) > 1 begin
            -- the 2 lines don't match, so mark for update
            update test1 set flag = 1 where field1 = @id
        end
        drop table #tmp

        delete #loop where id = @id
    end
...