sql觸發器刪除資料庫中的級聯記錄

iSQlServer發表於2010-04-20
SQL觸發器:當改變(增、刪、改)資料表的記錄時,繫結在SQL語句(增、刪、改)中的觸發器能夠觸發某些事件或者函式,所以我們可以在觸發器中編寫一些處理語句。

比如,當我們刪除新聞類別的時候,由於外來鍵的原因,我們無法刪除新聞類別下有新聞內容的記錄,但是通過觸發器,我們就可以實現。

delete from category where id=5  --sql刪除語句

create trigger trigcategorydelete  --當執行sql刪除語句時,執行觸發器

on category

after delete

as

begin

delete news where caId=(select id from deleted) --刪除對應新聞類別的新聞內容

end

     照一般的思維,這樣就可以同時刪除新聞類別和其下的新聞內容,但是這樣執行卻不成功。是因為關鍵字AFTER,AFTER表示在執行SQL刪除語句後,再執行觸發器裡的語句。這樣一來,順序同樣是先刪除新聞再刪除新聞內容,肯定不成功。

改變關鍵字after為instead of

instead of,表示代替delete操作,而沒有真正delete from category where id=5,當category表的刪除時,同時觸發了trigcategorydelete觸發器,但是由於有instead of關鍵字,所以本身並不執行刪除操作,而是執行觸發器裡的sql語句,從而可以替代之前的SQL語句。比如:

create trigger trigcategorydelete

on category

instead of delete

as

begin

declare @id int  --定義一個變數id

select @id=id from deleted  --從deleted臨時表中,賦值id給變數@id

delete news where caId=@id  --先刪除該類別下的所有新聞

delete category where id=@id  --然後刪除新聞類別 

end

當我們執行 delete from category where id=5時,id=5的類別並沒有真正刪除,而是轉而執行觸發器裡面的SQL語句

關於deleted表:

      Deleted表用於儲存 DELETE 和 UPDATE 語句所影響的行的複本。在執行 DELETE 或 UPDATE 語句時,行從觸發器表中刪除,並傳輸到deleted表中。Deleted表和觸發器表通常沒有相同的行。(//最後一句不是怎麼明白啊?) by google

     刪除一條記錄時候,他會把刪除的這條記錄放在一張臨時表裡,當你對category表進行刪除時,在SQL返回的結果訊息裡面會提示出你刪除的記錄。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-660249/,如需轉載,請註明出處,否則將追究法律責任。

相關文章