2010-11-17 85 views
4

我是SQL中的新手。我正在閱讀關於SQL中的觸發器。我已經得到了幾乎關於觸發器。但在DML觸發器中,我們使用FOR/AFTER關鍵字。我沒有得到FOR/AFTER和爲什麼使用FOR/AFTER關鍵字之間的區別。我已經閱讀了MSDN,但沒有得到簡單的答案。 任何人都可以解釋我是什麼?FOR/AFTER在SQL觸發器中

在此先感謝。

回答

7

存在使用FOR和之後之間沒有區別。

我相信原來的(2000年以前的)語法只使用FOR關鍵字。但是,當引入INSTEAD OF觸發器時,「FOR」關鍵字可能看起來很混亂。 「AFTER」更準確地表達了觸發器的類型,並且更容易與「INSTEAD OF」區分開來。如果我們想改變什麼插入表,或防止插入的發生


INSTEAD OF觸發器將被使用。

如果我們想根據剛剛發生的情況執行其他任務,則通常會使用AFTER觸發器。例如,你可以有一個「AFTER DELETE」觸發器,它將已刪除的行復制到某種歸檔表中。基本上,在AFTER觸發器中,通常情況下您仍然希望活動發生。

+0

謝謝你的答覆。像在相反的觸發器,我們可以避免用戶編寫的腳本,我們可以使用我們的腳本。所以,你能告訴我爲什麼我們使用FOR | AFTER – 2010-11-17 10:54:11

2

MSDN

後如果發生違反約束觸發器是永遠不會被執行;因此,這些觸發器不能用於可能防止違反約束的任何處理。

而且then

您可以要求通過指定的AFTER或FOR關鍵字AFTER觸發器。由於FOR關鍵字與AFTER具有相同的效果,因此使用FOR關鍵字的DML觸發器也被歸類爲AFTER觸發器

這似乎沒有區別。

+0

謝謝你的回覆。像在取代觸發器,我們可以避免用戶編寫的腳本,我們可以使用我們的腳本。所以,你能告訴我爲什麼我們使用FOR | AFTER – 2010-11-17 10:54:39

+0

好吧,這就是爲什麼我發佈第一個引用。在操作發生後,'AFTER'觸發器被執行,但是隻有當它成功時,如果由於例如違反約束而失敗,則不會執行。 「INSTEAD OF」觸發器取代了該動作,因此也可以阻止該動作。 – thomaspaulb 2010-11-17 11:06:04

1

它們是相同的。請參閱BOL 「 」 FOR | AFTER AFTER指定只有在觸發SQL語句中指定的所有操作都已成功執行時觸發DML觸發器,所有引用級聯操作和約束檢查也必須在觸發器觸發前成功執行

AFTER爲默認時FOR是指定的唯一關鍵字。

AFTER觸發器不能在視圖上被定義。 「

+0

感謝您的答覆。像在而不是觸發器,我們可以避免用戶編寫的腳本,我們可以使用我們的腳本。所以,你能告訴我爲什麼我們使用FOR |後 – 2010-11-17 10:53:38

2

如果我正確地將您的評論解釋爲其他答案,您想知道爲什麼或何時使用「FOR | AFTER」關鍵字。

很簡單:有兩種觸發器,AFTER觸發器和INSTEAD-OF-trigger。
INSTEAD-OF-trigger用於例如插入操作可被寫爲

create trigger myTrigger on myTable 
INSTEAD OF insert 
begin 
    (... code goes here ...) 
end 

和後觸發可被寫爲任一

create trigger myTrigger on myTable 
AFTER insert 
begin 
    (... code goes here ...) 
end 

create trigger myTrigger on myTable 
FOR insert 
begin 
    (... code goes here ...) 
end 

作爲Damien_The_Unbeliever提及,關鍵字AFTER比更具有可讀性FOR版本,就是這樣。

+0

謝謝基督徒:) – 2010-11-17 11:28:03

+0

順便說一句,你是什麼意思,「我們可以避免腳本哪些是用戶編寫的,我們可以使用我們的腳本「? – 2010-11-17 11:57:23

0

根據我所觀察到的,FOR用於DDL觸發器,而AFTER用於DML觸發器。他們有相同的工作方式。