使用SQL觸發器刪除級聯記錄
下文將為您介紹使用SQL觸發器來刪除級聯揭露的方法,并附相關實例,供您參考,希望對您有所幫助。
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#p#
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返回的結果消息里面會提示出你刪除的記錄。