2010-05-05 185 views
1

我認爲「刪除後」意味着觸發器不會被解僱,直到刪除已經發生之後,但這裏是我的情況...刪除後刪除觸發器只會觸發嗎?

我在C#中刪除觸發器後發了3個幾乎相同的SQL CLR,其中工作了一個月左右的精美。突然之間,三個中的一個停止工作,同時在其上運行自動刪除工具。

停止工作,我的意思是,記錄不能通過客戶端軟件從表中刪除。禁用觸發器會導致刪除被允許,但重新啓用它會干擾刪除的能力。

所以我的問題是'這怎麼可能是這種情況?'是否有可能在其上使用的工具破壞了內存?它似乎即使觸發器拋出一個異常,如果它是刪除後,不應該記錄消失?

所有觸發看起來是這樣的:

ALTER TRIGGER [sysdba].[AccountTrigger] ON [sysdba].[ACCOUNT] AFTER DELETE AS 
EXTERNAL NAME [SQL_IO].[SQL_IO.WriteFunctions].[AccountTrigger] 
GO 

的CLR觸發做一個選擇,一個插入到另一個數據庫。我還不知道SQL Server Mgmt Studio是否有任何錯誤,但在我發現後會更新這個問題。

UPDATE:

好以後再執行上述相同的觸發代碼,一切再次工作,所以我可能永遠不會知道任何錯誤SSMS會給什麼。

另外,在觸發器代碼中的任何地方都沒有回調。

回答

6

後,意味着它只是在事件之後,它仍然可以回滾

例如

create table test(id int) 
go 


create trigger trDelete on test after delete 
as 

print 'i fired ' 
rollback 

執行插入

insert test values (1) 

現在刪除數據

delete test 

H ERE是從觸發

輸出我解僱

消息3609,級別16,狀態1,行

在觸發器中結束交易。該批次已被中止。

現在檢查表,並確認沒有刪除

select * from test 

的CLR觸發不一個選擇和 一個插入到另一個數據庫中。我 不知道是否有任何來自SQL Server Mgmt Studio的錯誤 ,但在我發現後將更新該問題。

突然之間,三個中的一個停止了 的工作,同時在其上運行了自動刪除工具 。

觸發器觸發每個批次/語句不是每行,是否有可能觸發器沒有編碼爲多行操作,並且自動化工具在批次中刪除了多於一行?看看Best Practice: Coding SQL Server triggers for multi-row operations

下面是一個例子,這將使觸發失敗沒有做明確的回滾

alter trigger trDelete on test after delete 
as 

print 'i fired ' 
declare @id int 
select @id = (select id from deleted) 
GO 

插入一些行

insert test values (1) 
insert test values (2) 
insert test values (3) 

來看,這種

delete test 

我解僱了 Msg 512,Level 16,State 1,Procedure trDelete,Line 6

子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

該聲明已終止。

檢查表

select * from test 

沒有刪除

+0

是的,我知道您可以回滾事務,但我沒有回滾它?有沒有這種情況會自動發生? – Brandi 2010-05-05 14:57:05

+0

是的,請參閱附加代碼 – SQLMenace 2010-05-05 15:11:06

+0

非常感謝。 :) – Brandi 2010-05-05 15:12:56

1

AFTER DELETE觸發器中的錯誤將回退事務。這是在他們被刪除之後但在變更提交之前。有沒有什麼特別的原因讓你使用CLR觸發器?這似乎是一個純粹的SQL觸發器應該能夠以一種可能更輕量級的方式來完成的事情。

+0

其實,我有很多很好的理由去做我所做的事情。我不知道爲什麼有人總是讚揚只能批評的人,但原因之一是:最初我確實有SQL觸發器 - 它偶爾會掛起,而c#在SQL讀取器上有一個自動超時。其次,我需要寫入一個文件(雖然後來我改變了這個要求),併產生了一個命令行進程,該進程收集從SQL Server登錄信息轉換而來的Windows用戶數據。最後,我異步生成我的C#進程,以便即使它掛起,也不會影響用戶。 – Brandi 2010-05-05 15:04:10

+0

我沒有批評。我問你是否有任何使用CLR觸發器的特殊原因。我不知道你爲什麼如此自信,如果你確信他們是很好的理由。 – 2010-05-05 16:47:23

1

那麼你不應該做的觸發器選擇(誰將會看到的結果),如果你正在做的是插入它不該也不是CLR觸發器。在觸發器中使用CLR通常不是好事,除非你需要做一些t-sql無法處理的東西,這在觸發器中使用t-SQL代碼要好得多,無論如何這在觸發器中可能是個壞主意。

你是否恢復到源代碼管理中的最新版本?也許這會清除問題,如果它已經損壞。

+0

我需要「SELECT HOST_NAME()」的信息。我確實有源代碼管理,所以這不是一個擔心。 – Brandi 2010-05-05 15:06:25