sql >> Databáze >  >> RDS >> Sqlserver

Při kaskádě mazání pro samoodkazovací tabulku

Za předpokladu, že si ponecháte svůj FOREIGN KEY omezení, nemůžete problém vyřešit v FOR DELETE spoušť. FOR spouštěče (známé také jako AFTER spouští) spustit po aktivita proběhla. A cizí klíč zabrání řádek před smazáním, pokud má odkazy. Kontroly cizího klíče probíhají před smazání.

Co potřebujete, je INSTEAD OF spoušť. Musíte také mít na paměti, že váš aktuální spouštěč se pokusil vypořádat pouze s jednou „úrovní“ odkazování. (Pokud tedy řádek 3 odkazuje na řádek 2 a řádek 2 odkazuje na řádek 1 a vy smažete řádek 1, váš spouštěč se pokusil odstranit pouze řádek 2)

Takže něco jako:

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

Pokud existují jiná omezení (bez sebeodkazování), kaskádová omezení cizího klíče, musí být všechna nahrazena akcemi v tomto spouštěči. V takovém případě bych doporučil zavést proměnnou tabulky, která bude obsahovat seznam všech ID, která budou nakonec odstraněna z Comments tabulka:

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. Jak dekódovat hex bajtového sloupce PostgreSQL na int16/uint16 v r?

  2. Podporuje váš ovladač Salesforce hromadné akce?

  3. Správa uživatelských účtů, role, oprávnění, autentizace PHP a MySQL - 2. část

  4. jaká je escape sekvence pro pomlčku (-) v PostgreSQL