Trigger
防止在 SYBASE 中未進行任何更改時觸發 UPDATE TRIGGER
在 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)
希望能幫助到你。