Trigger

防止在 SYBASE 中未進行任何更改時觸發 UPDATE TRIGGER

  • January 23, 2018

在 Sybase 中,我有一個主表test和一個審計表test_a。審計表由插入、更新和刪除觸發器更新。現在的問題是,當我對舊數據(沒有更改)使用更新查詢時,觸發器仍然會被觸發並記錄在我不想要的審計表中(以防止在沒有更改時重複)。

test

Id | NAME | DESC

test_a

updated_by | date | Id | NAME | DESC

這是我擁有的更新觸發器:

create trigger test_utrig on test for update as  
insert into audit..test_a select 'update',update_by(),getdate() inserted.* from inserted

我嘗試使用if (update(Id) or update(NAME) or update(DESC)),但更新觸發器仍然會在沒有更改時觸發。請幫助我如何在未完成任何更改時停止觸發觸發。

我不知道 SyBase,但從文件看來,您似乎可以檢查一個或多個列是否已更新。檢查一個是否已更新應該就足夠了,例如:

create trigger test_utrig on test 
for update as  
   if update (id)
       insert into audit..test_a (updated_by, date, Id, ,NAME, DESC)
       select update_by(), getdate(), inserted.Id, inserted.NAME, inserted.DESC 
       from inserted

觸發器中的列數和審計表中的列數似乎不匹配,因此我刪除了常量“更新”。

您不僅應該檢查表中是否有資訊inserted,還應該檢查是否與表中的資訊不同deleted

Test

Id | NAME | DESC

Test_a

Event | updated_by | date | Id | NAME | DESC

此觸發器可防止更改 Id 並檢查其他列中是否有任何更改。如果有任何修改將其插入Test_a表中。

CREATE TRIGGER test_utrig on test for update as 
   IF UPDATE(Id)
   BEGIN
       raiserror 9000 "Can't change Id"
       RETURN
   END 
   INSERT INTO audit..test_a
   SELECT 'Update',
           update_by(),
           getdate(),
           i.* 
   FROM
       inserted i,
       deleted  d
   WHERE
       i.Id = d.Id
   AND (   i.NAME <> d.NAME
        OR i.DESC <> d.DESC)

希望能幫助到你。

引用自:https://dba.stackexchange.com/questions/143922