2010-07-29 76 views
10

當我想使用SQL Server 2008 R2的預定義「CREATE TRIGGER」創建觸發器時,我迷路了。你能否給我一個直接的SQL語句來創建觸發器,並告訴我如何定義AFTER,BEFORE等等?在SQL Server中創建觸發器

另外,我如何知道UPDATED/INSERTED/DELETED行,並使用它們的列值在觸發器內執行操作?

+0

@約翰:該產品被稱爲 「SQL服務器」,而不是 「MSSQL」。 「MSSQL」很容易與「MySQL」混淆。另外,當問一個SQL Server問題時,我建議你使用「sql-server」標籤。 「sql」是關於SQL語言的一般問題。 – 2010-07-29 02:17:46

+0

好的謝謝你的注意。會這樣做。 – johnshaddad 2010-07-29 02:19:51

+0

您的問題只是關於如何定義觸發器,或者是如何編寫可用於在受影響的行上操作的觸發器?如果後者,那麼你應該考慮改寫你的問題。 – Thomas 2010-07-29 02:35:32

回答

2

數據庫是面向集合的,觸發器也不例外。觸發器會在執行給定操作時觸發,並且該操作可能會影響多行。因此,"Say I want to know the Primary Key of that row"這個問題是錯誤的。可能會插入多行。

SQL Server提供了兩個特殊表的名字命名inserteddeleted觸發器代表插入或動作刪除了與表中受影響的相同結構的行。更新觸發器可能會填充inserteddeleted,而插入觸發器只會填充inserted表。

從評論:

但電子郵件收件人將基於在第二表,其中外鍵ID位於第一個表(這是一個與觸發值而決定

這個問題的答案是使用inserted表(它必須假設可能有多行)循環遍歷行併發送電子郵件。但是,我建議不要將電子郵件邏輯放在觸發器中。 ,我會建議將該邏輯放入存儲過程並從t發送您的電子郵件帽子。

參考:Create Trigger

+0

然後從觸發器調用該過程?你是這個意思嗎?但是,不是sql的郵件系統程序足以處理觸發器中的那個嗎?或者我應該創建一個調用該系統過程的過程,然後在觸發器中調用此過程? – johnshaddad 2010-07-29 02:35:13

+0

@johnshaddad - 不,我不會從觸發器中進行電子郵件操作。相反,我會讓你的調用代碼使用存儲過程,而不是直接對錶進行操作。 – Thomas 2010-07-29 02:38:52

+0

當你說「可能有多行插入。」不是多次觸發觸發器?或者如何?你能解釋一下我將如何在這種情況下循環? – johnshaddad 2010-07-29 02:46:58

2

觸發器是一個基於事件的過程,在以某種方式更改表後會「觸發」。這將在DELETE,UPDATE,INSERT等等。您的BEFORE和AFTER語法將定義在事件提交之前還是之後運行觸發器。

這是簡短的版本。檢出MSDN

+0

是的,我熟悉MySQL上的觸發器,但不熟悉MSSQL,所以我認爲有不同的實現方式。 謝謝! – johnshaddad 2010-07-29 02:10:10

+0

但我怎麼知道哪一行正在更新?假設我想知道該行的主鍵,該怎麼做?在添加新項目之後喜歡發送電子郵件,但電子郵件收件人將根據第二個表格中的值決定,其中外鍵ID位於第一個表格中(這是帶觸發器的表格) – johnshaddad 2010-07-29 02:14:39

+0

mrdenny's回覆Joel Coehoorn的回答是一個很好的總結。 – 2010-07-29 03:03:38

10

的基本語法

CREATE TRIGGER YourTriggerName ON dbo.YourTable 
FOR|AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    /*Put what ever you want here*/ 
    UPDATE AnotherTable 
      SET SomeColumn = AnotherColumn 
    FROM inserted | deleted 
END 
GO 
+0

我正在嘗試這種方式,它在MS服務器中不適用於我。 – 2014-06-16 13:54:30