使用SQL觸發(fā)器刪除級(jí)聯(lián)記錄
下文將為您介紹使用SQL觸發(fā)器來(lái)刪除級(jí)聯(lián)揭露的方法,并附相關(guān)實(shí)例,供您參考,希望對(duì)您有所幫助。
SQL觸發(fā)器:當(dāng)改變(增、刪、改)數(shù)據(jù)表的記錄時(shí),綁定在SQL語(yǔ)句(增、刪、改)中的觸發(fā)器能夠觸發(fā)某些事件或者函數(shù),所以我們可以在觸發(fā)器中編寫(xiě)一些處理語(yǔ)句。
比如,當(dāng)我們刪除新聞?lì)悇e的時(shí)候,由于外鍵的原因,我們無(wú)法刪除新聞?lì)悇e下有新聞內(nèi)容的記錄,但是通過(guò)觸發(fā)器,我們就可以實(shí)現(xiàn)。
delete from category where id=5 --sql刪除語(yǔ)句
create trigger trigcategorydelete --當(dāng)執(zhí)行sql刪除語(yǔ)句時(shí),執(zhí)行觸發(fā)器
on category
after delete
as
begin
delete news where caId=(select id from deleted) --刪除對(duì)應(yīng)新聞?lì)悇e的新聞內(nèi)容
end
照一般的思維,這樣就可以同時(shí)刪除新聞?lì)悇e和其下的新聞內(nèi)容,但是這樣執(zhí)行卻不成功。是因?yàn)殛P(guān)鍵字AFTER,AFTER表示在執(zhí)行SQL刪除語(yǔ)句后,再執(zhí)行觸發(fā)器里的語(yǔ)句。這樣一來(lái),順序同樣是先刪除新聞再刪除新聞內(nèi)容,肯定不成功。
改變關(guān)鍵字after為instead of#p#
instead of,表示代替delete操作,而沒(méi)有真正delete from category where id=5,當(dāng)category表的刪除時(shí),同時(shí)觸發(fā)了trigcategorydelete觸發(fā)器,但是由于有instead of關(guān)鍵字,所以本身并不執(zhí)行刪除操作,而是執(zhí)行觸發(fā)器里的sql語(yǔ)句,從而可以替代之前的SQL語(yǔ)句。比如:
create trigger trigcategorydelete
on category
instead of delete
as
begin
declare @id int --定義一個(gè)變量id
select @id=id from deleted --從deleted臨時(shí)表中,賦值id給變量@id
delete news where caId=@id --先刪除該類(lèi)別下的所有新聞
delete category where id=@id --然后刪除新聞?lì)悇e
end
當(dāng)我們執(zhí)行 delete from category where id=5時(shí),id=5的類(lèi)別并沒(méi)有真正刪除,而是轉(zhuǎn)而執(zhí)行觸發(fā)器里面的SQL語(yǔ)句
關(guān)于deleted表:
Deleted表用于存儲(chǔ) DELETE 和 UPDATE 語(yǔ)句所影響的行的復(fù)本。在執(zhí)行 DELETE 或 UPDATE 語(yǔ)句時(shí),行從觸發(fā)器表中刪除,并傳輸?shù)絛eleted表中。Deleted表和觸發(fā)器表通常沒(méi)有相同的行。(//最后一句不是怎么明白?。浚?by google
刪除一條記錄時(shí)候,他會(huì)把刪除的這條記錄放在一張臨時(shí)表里,當(dāng)你對(duì)category表進(jìn)行刪除時(shí),在SQL返回的結(jié)果消息里面會(huì)提示出你刪除的記錄。