2011-02-28 76 views
0

是否存在觸發器未被觸發的任何條件?SQL觸發器不起作用

我們有這樣的情況:

我們有一個表,但是也有一些被刪除的行。我們需要知道這些行被刪除的人和/或時間。

我們創建這個觸發器:

ALTER TRIGGER [dbo].[AUDITdel_nit] ON [dbo].[Client] 
FOR DELETE 
AS 
Insert into AUDIT select 'Delete', getdate(), 'Row Deleted', SYSTEM_USER, host_name(), 
(select 'ID Client: ' + convert(varchar(12),Id) from deleted), 'Client' ,APP_NAME() 

我們做了一些測試:通過存儲過程刪除行和刪除的行出現在我們的審計表。

但是今天突然發現一列被刪除,它不會出現在審計表...

任何想法可能是錯誤的?

+1

什麼DBMS是你嗎? – Nishant 2011-02-28 15:25:57

+0

您使用的是什麼RDMS(它看起來像給予「GETDATE()」調用的SQL Server)。 – RQDQ 2011-02-28 15:26:36

+0

這不是你的問題的原因,但當前的觸發代碼不帶多行刪除處理(他們會導致您的觸發一個錯誤,那麼這將回滾的變化) – 2011-02-28 15:30:08

回答

0

你能檢查你的觸發器是否失效嗎?

SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME = 'your_trigger' AND OBJECT_TYPE = 'TRIGGER' AND STATUS <> 'VALID' 
+0

謝謝Ricko ..在MS SQL中我找不到狀態欄! – Gabrielizalo 2011-02-28 17:01:16

0

我覺得刪除後的插入語句不起作用。所以你可以檢查審計插入失敗的原因。

Insert into AUDIT select 'Delete', getdate(), 'Row Deleted', SYSTEM_USER, host_name(), 
(select 'ID Client: ' + convert(varchar(12),Id) from deleted), 'Client' ,APP_NAME() 
1

你需要使它處理多個記錄刪除它目前還無法做到。假設多個記錄將被刪除,插入或更新,所有觸發器必須始終寫入。

ALTER TRIGGER [dbo].[AUDITdel_nit] ON [dbo].[Client] 
FOR DELETE AS 

INSERT INTO AUDIT 
SELECT 'Delete', getdate(), 'Row Deleted', SYSTEM_USER, host_name(), 
     'ID Client: ' + convert(varchar(12),Id) , 'Client' ,APP_NAME() 
FROM DELETED 

批量插入也可以繞過觸發器和truncate table的行動還沒有登錄不涉及觸發器,但我認爲這些都不是您的問題在這裏。 Openrowset語句也可以運行以忽略觸發器。你可以在你的代碼中搜索這個短語來查看一個進程是否正在這樣做:WITH(IGNORE_TRIGGERS)。您還可以專門禁用並重新啓用觸發器,但生產中的任何人都不應該有權這樣做,除了dbas。如果每個人都擁有這些權利,那麼您需要儘快解決這個問題。

+0

但是由於他們目前已經有了觸發器,所以他們在子查詢中選擇刪除 - 所以如果是多行刪除,他們會從子查詢中得到多個結果的錯誤。這就是爲什麼我說這不可能是真正的問題。 – 2011-02-28 15:38:51

+0

但它不是一個相關的查詢,所以他們可能不會,我不得不測試看看。無論如何,不​​解決這個問題是不負責任的。 – HLGEM 2011-02-28 15:42:40

+0

是@Damien你是對的,這會導致錯誤發生。 – HLGEM 2011-02-28 15:45:19

0

由於您使用的觸發器,有沒有一些改變客戶表是由其他觸發器引起的,而nested triggers選項設置爲0的可能性?這不是默認設置,但會導致觸發器在此情況下不會觸發。下面是一個演示效果。要查看是否已設置此選項,只需運行sp_configure而不帶參數,然後找到nested triggers行。

sp_configure 'nested triggers','0' 
go 
reconfigure 
go 
create table T3 (
    ID int not null 
) 
go 
create table T2 (
    ID int not null 
) 
go 
create trigger T_T2 
on T2 
for insert 
as 
    insert into T3(ID) select ID from inserted 
go 
create table T1 (
    ID int not null 
) 
go 
create trigger T_T1 
on T1 
for insert 
as 
    insert into T2(ID) select ID from inserted 
go 
insert into T1(ID) 
select 1 
go 
select * from T1 
select * from T2 
select * from T3 

消息&結果:

Configuration option 'nested triggers' changed from 1 to 0. Run the RECONFIGURE statement to install. 

(1 row(s) affected) 

ID 
---- 
1 
(1 row(s) affected) 

ID 
---- 
1 
(1 row(s) affected) 

ID 
---- 
(0 row(s) affected)