Триггер SQL Server не срабатывает должным образом - PullRequest
2 голосов
/ 25 ноября 2010

У меня есть триггер, который, я думал, будет обновляться только при обновлении одного из столбцов, а не таблицы. Есть ли способ переписать это, чтобы он срабатывал только при обновлении указанных столбцов, а не других полей в таблице

CREATE TRIGGER [afm].[afm_rm_dwgs_t] ON [afm].[rm] 
   FOR UPDATE
AS
   IF (UPDATE(area) OR UPDATE(dv_id) 
   OR UPDATE(dp_id) OR UPDATE(rm_cat) 
   OR UPDATE(rm_type) OR UPDATE(rm_std))
   BEGIN
      SET NOCOUNT ON;
      UPDATE afm.afm_dwgs 
      SET dwg_updt = 1 
      WHERE afm_dwgs.dwg_name IN (SELECT dwgname FROM inserted)
   END

Ответы [ 3 ]

1 голос
/ 25 ноября 2010

предположим, что вы хотите проверить, обновлен ли столбец области, тогда код будет выглядеть так:

declare @oldArea varchar(50)
declare @newArea varchar(50)

select @oldArea= area from deleted
select @newArea=area from inserted

if ( @oldArea <> @newArea)
-- area is updated
1 голос
/ 25 ноября 2010

Нет, триггер определен как FOR UPDATE ON [afm]. [Rm] , поэтому он всегда будет срабатывать при каждом обновлении в этой таблице.Нет никакого способа ограничить это авансом.

Ваша проверка внутри триггера тогда исключит любые «лишние» активации триггера от фактического выполнения чего-либо.

0 голосов
/ 25 ноября 2010

UPDATE () означает только, что столбец был включен в набор данных. Это не дает представления о том, отличаются ли базовые данные.

Вам нужно будет немного сложнее, чем это.

Вам необходимо сравнить значения DELETED и INSERTED, чтобы увидеть, есть ли изменения.

Проверьте эту ссылку для получения дополнительной информации.

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