當我想使用SQL Server 2008 R2的預定義「CREATE TRIGGER」創建觸發器時,我迷路了。你能否給我一個直接的SQL語句來創建觸發器,並告訴我如何定義AFTER,BEFORE等等?在SQL Server中創建觸發器
另外,我如何知道UPDATED/INSERTED/DELETED行,並使用它們的列值在觸發器內執行操作?
當我想使用SQL Server 2008 R2的預定義「CREATE TRIGGER」創建觸發器時,我迷路了。你能否給我一個直接的SQL語句來創建觸發器,並告訴我如何定義AFTER,BEFORE等等?在SQL Server中創建觸發器
另外,我如何知道UPDATED/INSERTED/DELETED行,並使用它們的列值在觸發器內執行操作?
數據庫是面向集合的,觸發器也不例外。觸發器會在執行給定操作時觸發,並且該操作可能會影響多行。因此,"Say I want to know the Primary Key of that row"
這個問題是錯誤的。可能會插入多行。
SQL Server提供了兩個特殊表的名字命名inserted
和deleted
觸發器代表插入或動作刪除了與表中受影響的相同結構的行。更新觸發器可能會填充inserted
和deleted
,而插入觸發器只會填充inserted
表。
從評論:
但電子郵件收件人將基於在第二表,其中外鍵ID位於第一個表(這是一個與觸發值而決定
這個問題的答案是使用inserted
表(它必須假設可能有多行)循環遍歷行併發送電子郵件。但是,我建議不要將電子郵件邏輯放在觸發器中。 ,我會建議將該邏輯放入存儲過程並從t發送您的電子郵件帽子。
然後從觸發器調用該過程?你是這個意思嗎?但是,不是sql的郵件系統程序足以處理觸發器中的那個嗎?或者我應該創建一個調用該系統過程的過程,然後在觸發器中調用此過程? – johnshaddad 2010-07-29 02:35:13
@johnshaddad - 不,我不會從觸發器中進行電子郵件操作。相反,我會讓你的調用代碼使用存儲過程,而不是直接對錶進行操作。 – Thomas 2010-07-29 02:38:52
當你說「可能有多行插入。」不是多次觸發觸發器?或者如何?你能解釋一下我將如何在這種情況下循環? – johnshaddad 2010-07-29 02:46:58
觸發器是一個基於事件的過程,在以某種方式更改表後會「觸發」。這將在DELETE,UPDATE,INSERT等等。您的BEFORE和AFTER語法將定義在事件提交之前還是之後運行觸發器。
這是簡短的版本。檢出MSDN。
是的,我熟悉MySQL上的觸發器,但不熟悉MSSQL,所以我認爲有不同的實現方式。 謝謝! – johnshaddad 2010-07-29 02:10:10
但我怎麼知道哪一行正在更新?假設我想知道該行的主鍵,該怎麼做?在添加新項目之後喜歡發送電子郵件,但電子郵件收件人將根據第二個表格中的值決定,其中外鍵ID位於第一個表格中(這是帶觸發器的表格) – johnshaddad 2010-07-29 02:14:39
mrdenny's回覆Joel Coehoorn的回答是一個很好的總結。 – 2010-07-29 03:03:38
的基本語法
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
我正在嘗試這種方式,它在MS服務器中不適用於我。 – 2014-06-16 13:54:30
@約翰:該產品被稱爲 「SQL服務器」,而不是 「MSSQL」。 「MSSQL」很容易與「MySQL」混淆。另外,當問一個SQL Server問題時,我建議你使用「sql-server」標籤。 「sql」是關於SQL語言的一般問題。 – 2010-07-29 02:17:46
好的謝謝你的注意。會這樣做。 – johnshaddad 2010-07-29 02:19:51
您的問題只是關於如何定義觸發器,或者是如何編寫可用於在受影響的行上操作的觸發器?如果後者,那麼你應該考慮改寫你的問題。 – Thomas 2010-07-29 02:35:32