sql >> Databasteknik >  >> RDS >> Sqlserver

På radera kaskad för självreferenstabell

Förutsatt att du behåller din FOREIGN KEY begränsning på plats kan du inte åtgärda problemet i en FOR DELETE utlösare. FOR utlösare (även känd som AFTER triggers) avfyras efter aktiviteten har ägt rum. Och en främmande nyckel kommer att förhindra en rad tas bort om den har referenser. Kontroller av främmande nyckel sker före radering.

Vad du behöver är en INSTEAD OF utlösare. Du måste också komma ihåg att din nuvarande trigger bara försökte hantera en "nivå" av referenser. (Så, om rad 3 hänvisar till rad 2 och rad 2 hänvisar till rad 1, och du tar bort rad 1, försökte din trigger bara ta bort rad 2)

Så, något i stil med:

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);

Om det finns andra (icke-självrefererande) kaskadande främmande nyckelbegränsningar måste de alla ersättas av åtgärder i denna utlösare. I ett sådant fall skulle jag rekommendera att införa en tabellvariabel för att hålla listan över alla ID:n som så småningom kommer att raderas från Comments tabell:

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. Där värde i kolumn som innehåller kommaavgränsade värden

  2. En översikt över den seriella pseudodatatypen för PostgreSQL

  3. LPAD i SQL Server 2008

  4. Kan jag kopiera en rad i MySQL för att infoga i samma tabell?