Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Po usunięciu kaskady dla tabeli samoodnoszącej się

Zakładając, że zachowujesz FOREIGN KEY ograniczenie w miejscu, nie można naprawić problemu w FOR DELETE cyngiel. FOR wyzwalacze (znane również jako AFTER wyzwalacze) uruchom po działalność miała miejsce. A klucz obcy zapobiegnie wiersz przed usunięciem, jeśli ma odniesienia. Sprawdzenie klucza obcego następuje przed usunięcie.

Potrzebujesz INSTEAD OF cyngiel. Musisz również pamiętać, że twój obecny wyzwalacz próbował poradzić sobie tylko z jednym „poziomem” odwoływania się. (Jeśli więc wiersz 3 odwołuje się do wiersza 2, a wiersz 2 odwołuje się do wiersza 1, a usuniesz wiersz 1, wyzwalacz próbował tylko usunąć wiersz 2)

A więc coś takiego:

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

Jeśli istnieją inne (nieodwołujące się do siebie) kaskadowe ograniczenia klucza obcego, wszystkie muszą zostać zastąpione przez akcje w tym wyzwalaczu. W takim przypadku zalecam wprowadzenie zmiennej tabeli do przechowywania listy wszystkich identyfikatorów, które ostatecznie zostaną usunięte z Comments tabela:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Różnica między sys.views, sys.system_views i sys.all_views w programie SQL Server

  2. 3 sposoby na uzyskanie schematu zbioru wyników w SQL Server

  3. Wartości dziesiętne w SQL do dzielenia wyników

  4. Jak mogę pominąć nawiasy kwadratowe w klauzuli LIKE?

  5. Trigram Wildcard – wyszukiwanie ciągów znaków w SQL Server