2010-11-24 2 views
2

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

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 

ответ

1

Нет, триггер определяются как FOR UPDATE ON [AFM]. [Ет], поэтому он всегда будет запускать каждое обновление в этой таблице. Невозможно ограничить это заранее.

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

1

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

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

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

if (@oldArea <> @newArea) 
-- area is updated 
+0

или просто `if (UPDATE ([FieldName]))`? – bevacqua 2010-11-24 22:18:40

0

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

Вам придется немного усложниться.

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

Проверьте, пожалуйста, this link для получения более подробной информации.

Смежные вопросы