2013-05-21 82 views
0

因此,讓我首先承認我是SQL Server新手。使用SELECT觸發中斷的SQL Server 2012表

以下是處理:我試圖在SQL Server 2012的表中創建一個觸發器,並且每當我在觸發器中嘗試任何一種SELECT語句時,表都會退出工作(因爲任何東西都可以插入,直到觸發器被刪除)。只要我放下觸發器,所有事情都會重新開始。如果我沒有做任何SELECT s,一切都很好。有沒有許可或某個我失蹤的地方?

實施例:

CREATE TRIGGER sometrigger 
ON sometable 
FOR INSERT 
AS 
BEGIN 
    SELECT * FROM inserted 
END 
GO 

命令成功完成,但該表變成如上所述冷凍。

CREATE TRIGGER sometrigger 
ON sometable 
FOR INSERT 
AS 
BEGIN 
    EXEC msdb.dbo.sp_send_dbmail 
    @recipients = N'[email protected]', 
    @subject = 'test', 
    @body = 'test body', 
    @profile_name = 'someprofile' 
END 
GO 

工程就像一個魅力。

+3

爲什麼要這麼做'選擇*'從觸發?誰會看到結果集? – Andomar

+0

你如何嘗試插入「它退出工作」的地方?它是否隱藏了異常/錯誤消息? –

+0

@Andomar我不會,這只是一個快速的例子來闡述我的問題。 – Bodacious

回答

0

您可能會因爲它應該是disallow results from triggers選項而被設置爲1而犯規。

注意,頁面上的警告:

該功能將在Microsoft SQL Server的下一個版本中刪除。請勿在新開發工作中使用此功能,並儘快修改當前使用此功能的應用程序。我們建議您將此值設置爲1

我猜想,無論你是從運行您的插入是隱藏的錯誤消息或異常,因爲你應該得到:

消息524,級別16,狀態1,過程,行

「觸發器返回結果集,服務器選項'disallow_results_from_triggers'爲true。」


或者,在備選方案中,你與它包裝在一個事務中的所有刀片,將回滾事務如果有什麼意外發生數據庫層的工作 - 如接收結果集,甚至只是一個額外的信息消息說(x rows affected)

但是所有這些都圍繞主要問題跳舞 - 你不應該發出一個嘗試從觸發器內部返回結果的select。如果你真的告訴我們你想要達到的目標,我可能會提供更多的幫助。

如果是第二種情況,它會跳過(x rows affected)消息,這可以通過將SET NOCOUNT ON置於觸發器的頂部來解決。

+0

好的,我試圖在沒有任何錯誤報告的系統上生成錯誤的電子郵件通知。我唯一能想到的就是觸發器,它檢查剛剛添加到數據庫的事件的嚴重性級別,並在出現嚴重性級別「錯誤」時發送電子郵件。 – Bodacious

+0

禁止結果選項設置爲0,並且已經設置了「SET NOCOUNT ON」。我只是試圖從'inserted'表中提取一些值,將它們分配給變量,並通過電子郵件發送。例如:'DECLARE @EventID int ... SELECT @EventID = [EventID] FROM inserted ... EXEC msdb.dbo.sp_send_dbmail ... @body = @ EventID'。我怎麼能做到這一點,而不返回結果? – Bodacious

+0

@Bodacious:在SQL Server中,使用SELECT檢索行與使用它分配變量有所不同,但SQL Server不允許混合這兩個變量。所以我的問題是,你真的嘗試了'SELECT @EventID = [EventID] FROM ...',即*變量賦值語法,而不僅僅是'SELECT [EventID] FROM ...'或者其他類型的*數據檢索*語法?另外,你是否嘗試過使用'inserted'作爲過濾器,在連接中,並從實際表(插入的目標)讀取數據? –

0

無論如何您都不應該從觸發器返回數據,主要是出於簡單和維護的原因。令人困惑的是:我做了一個INSERT,但得到了一個結果集。

如果你需要得到你剛插入的值,你會use the OUTPUT clause

INSERT sometable (...) 
OUTPUT INSERTED.* 
VALUES (...); 

這至少告訴你的INSERT給出的結果。

而且它是可嵌套太按,說,SQL Server concurrent transaction issue