sql >> Database >  >> RDS >> Sqlserver

Bij verwijderen cascade voor zelfverwijzende tabel

Ervan uitgaande dat u uw FOREIGN KEY . behoudt beperking aanwezig is, kunt u het probleem niet oplossen in een FOR DELETE trekker. FOR triggers (ook bekend als AFTER triggers) vuren na de activiteit heeft plaatsgevonden. En een externe sleutel verhindert een rij kan worden verwijderd als deze verwijzingen heeft. Externe sleutelcontroles vinden vóór . plaats verwijderen.

Wat je nodig hebt is een INSTEAD OF trekker. U moet er ook rekening mee houden dat uw huidige trigger slechts één "niveau" van verwijzingen probeerde aan te pakken. (Dus als rij 3 verwijst naar rij 2 en rij 2 naar rij 1 verwijst en u verwijdert rij 1, heeft uw trigger alleen geprobeerd rij 2) te verwijderen

Dus zoiets als:

CREATE TRIGGER [dbo].[T_comment_Trigger]
    ON [dbo].[Comments]
    INSTEAD OF DELETE
AS
    ;WITH IDs as (
       select id from deleted
       union all
       select c.id
       from Comments c
              inner join
            IDs i
              on
                 c.ParentID = i.id
    )
    DELETE FROM Comments
    WHERE id in (select id from IDs);

Als er andere (niet naar zichzelf verwijzende) trapsgewijze beperkingen voor externe sleutels zijn, moeten deze allemaal worden vervangen door acties in deze trigger. In een dergelijk geval raad ik aan om een ​​tabelvariabele in te voeren die de lijst bevat van alle ID's die uiteindelijk zullen worden verwijderd uit de Comments tafel:

CREATE TRIGGER [dbo].[T_comment_Trigger]
    ON [dbo].[Comments]
    INSTEAD OF DELETE
AS
    declare @deletions table (ID varchar(7) not null);
    ;WITH IDs as (
       select id from deleted
       union all
       select c.id
       from Comments c
              inner join
            IDs i
              on
                 c.ParentID = i.id
    )
    insert into @deletions(ID)
    select ID from IDs

    DELETE FROM OtherTable
    WHERE CommentID in (select ID from @deletions)

    --This delete comes last
    DELETE FROM Comments
    WHERE id in (select ID from @deletions);



  1. Meest efficiënte manier om rijen in de MySQL-database in te voegen

  2. Hoe kan ik SQL-injectie in PHP voorkomen?

  3. Hoe zou u sequenties implementeren in Microsoft SQL Server?

  4. Selecteer alle maanden binnen een bepaalde periode, inclusief die met 0 waarden