Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Khi xóa tầng cho bảng tự tham chiếu

Giả sử bạn đang giữ FOREIGN KEY của mình ràng buộc tại chỗ, bạn không thể khắc phục sự cố trong FOR DELETE cò súng. FOR trình kích hoạt (còn được gọi là AFTER kích hoạt) cháy sau khi hoạt động đã diễn ra. Và khóa ngoại sẽ ngăn chặn một hàng không bị xóa nếu nó có tham chiếu. Kiểm tra khóa ngoại xảy ra trước xóa.

Những gì bạn cần là một INSTEAD OF cò súng. Bạn cũng cần lưu ý rằng trình kích hoạt hiện tại của bạn chỉ cố gắng giải quyết một "cấp độ" tham chiếu. (Vì vậy, nếu hàng 3 tham chiếu hàng 2 và hàng 2 tham chiếu hàng 1 và bạn xóa hàng 1, trình kích hoạt của bạn chỉ cố gắng xóa hàng 2)

Vì vậy, một cái gì đó như:

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

Nếu có các ràng buộc khóa ngoại xếp tầng (không tự tham chiếu) khác, tất cả chúng phải được thay thế bằng các hành động trong trình kích hoạt này. Trong trường hợp như vậy, tôi khuyên bạn nên giới thiệu một biến bảng để giữ danh sách tất cả các ID cuối cùng sẽ bị xóa khỏi Comments bảng:

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. Làm cách nào để tạo và truy vấn các máy chủ cơ sở dữ liệu được liên kết trong SQL Server?

  2. Nhóm kết hợp trong SQL Server

  3. Chuyển danh sách <> sang thủ tục lưu trữ SQL

  4. Chèn hàng loạt tệp CSV được trích dẫn một phần trong SQL Server

  5. Với (nolock) trong SQL Server là gì?