2013-11-15 255 views
0

我正試圖創建一個刪除實際記錄之前刪除所有外鍵的觸發器。在SQL Server中刪除觸發器之前

問題是,當我刪除一條記錄時,它會在SQL Server Management Studio中消失,但是當我刷新頁面時,我再次找到它。任何人都知道問題在哪裏?

create Trigger deleteAffaire on AFFAIRE INSTEAD OF DELETE As 
begin 
    Declare @deletedAffaireId int 
    Declare @deletedPlanId int 

    set @deletedPlanId = 0; 

    select @deletedAffaireId = id_affaire from deleted; 

    begin 
     select @deletedPlanId = ID_ASSURENCE 
     from ASSURANCE_QUALITE 
     where ASSURANCE_QUALITE.ID_AFFAIRE = @deletedAffaireId; 

     delete from ASSURANCE_CONTACT_FONCTION 
     where ASSURANCE_CONTACT_FONCTION.ID_ASSURANCE = @deletedPlanId; 

     delete from JALON 
     where JALON.ID_JALON in (select ID_JALON from ASSURANCE_JALON_TYPE 
           where ASSURANCE_JALON_TYPE.ID_ASSURENCE = @deletedPlanId); 

     delete from ASSURANCE_JALON_TYPE 
     where ASSURANCE_JALON_TYPE.ID_ASSURENCE = @deletedPlanId; 

     delete from DOCUMENT 
     where DOCUMENT.ID_DOCUMENT in (select ID_DOCUMENT from ASSURENCE_DOCUMENT_TYPE 
             where ASSURENCE_DOCUMENT_TYPE.ID_ASSURENCE = @deletedPlanId); 

     delete from ASSURENCE_DOCUMENT_TYPE 
     where ASSURENCE_DOCUMENT_TYPE.ID_ASSURENCE = @deletedPlanId; 

     delete from ASSURANCE_QUALITE 
     where ASSURANCE_QUALITE.ID_ASSURENCE = @deletedPlanId; 
    end 
end 
+4

你的第一個問題是你的觸發器假設'deleted'只包含1行。這是一個非常破碎的假設。 –

回答

5

你在桌子上AFFAIRE做一個INSTEAD OF DELETE觸發尚未在觸發身體,你無法真正從AFFAIRE刪除任何東西。

一個INSTEAD OF觸發器不是'之前'觸發器。顧名思義,是而不是觸發器。如果你沒有真正刪除觸發器的行,那麼......它們不會被刪除。

你確定你不能使用更傳統的方式實現你想要的,比如級聯刪除外鍵?

+0

我知道我可以使用級聯刪除,但是當我使用級聯刪除時,它會刪除所有引用Affaire表的記錄。這就是爲什麼我試圖使用之前的觸發器。我嘗試,但它並沒有工作,所以而不是我起初看起來工作,但當我刷新頁面,我發現記錄 –

+0

@slatniawadii,級聯創建刪除所有值引用到正在被刪除的另一個值。在使用FK時,刪除值時,數據庫將因FK必須有關係而脫扣,通過刪除值,還需要刪除子值,否則會得到充滿錯誤項目的數據庫。 – Schuere

+0

是的我知道你是什麼意思我但我需要它與觸發器沒有默認cascad –

0

刪除最後您要在觸發器中刪除的記錄。由於它不是觸發器,它不會實際刪除,除非您在觸發器中明確執行。