триггер сервера sql для обновления поля времени, когда есть реальные изменения в другом поле - PullRequest
3 голосов
/ 24 июля 2011

Мне нужен триггер, который обновляет поле строки таблицы, если обновлено одно или несколько полей этой строки.

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

EmployeeId    Name       Address                ModificationDate
1             Spears     27 Sober Road 
2             Jagger     65 Straight Street 

Если есть реальное изменение значения какого-либо поля, кроме полей EmployeeId и ModificationDate, триггер должен сгенерировать значение времени и обновить ModificationDate.

Пример 1 реального изменения:

update dbo.Employees
set Name = 'Beggar'
where EmployeeId = 2

Пример 2 без реальных изменений:

update dbo.Employees
set Name = 'Jagger'
where EmployeeId = 2

Если выполняется обновление в Примере 2, триггер не должен обновлять поле ModificationDate.

1 Ответ

9 голосов
/ 24 июля 2011

В триггере у вас есть доступ к «вставленным» и «удаленным» системным таблицам.Эти таблицы содержат записи в таблице, которые были обновлены оператором, вызвавшим выполнение триггера.

Для триггера «ОБНОВЛЕНИЕ» таблица «вставлена» содержит записи, как будто они находятся в новом состоянии.«Удаленная» таблица содержит записи со старыми значениями.

Вам нужно будет использовать эти 2 таблицы, чтобы узнать, какие записи действительно изменились, и обновить ModificationDate для этих записей.

Я думаю, что выражение внутри триггера будет выглядеть примерно так.(Я не проверял это)

UPDATE myTable
SET ModificationDate = getdate()
FROM inserted, deleted
WHERE inserted.EmployeeId = deleted.EmployeeId
AND (inserted.Name <> deleted.Name OR inserted.Address <> deleted.Address)

Редактировать: я немного поиграл:

create trigger upd_employee on [employee] after update
as
begin

    update employee
    set modifdate = getdate()   
    where employee.empid in 
    ( select i.empid
      from inserted i
      inner join deleted d on i.empid = d.empid 
      where (i.name <> d.name or i.address <> d.address )
    )
end

insert into employee 
values
(1, 'Frederik' , '', null)

insert into employee
values
(2, 'User', '', null)

update employee
set [address] = 'some address'

select * from employee

update employee set [name] = 'test' where empid = 2

select * from employee

update employee set [name] = 'test' where empid = 2

select * from employee
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...