Sql server SQL Server 2014,触发器:如何迭代已删除的行?

Sql server SQL Server 2014,触发器:如何迭代已删除的行?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,注意!使用触发器对我来说是必要的!我执行以下任务所需的唯一方法是使用触发器 问题是-我需要一个触发器,在某个表中删除行时调用它。触发器必须做的事情-迭代每个已删除的 行,并根据当前迭代的行值执行一些代码 例如,我做了这个触发器,当我删除一行时它就工作了 凭命令 DELETE FROM books WHERE id=5 触发因素如下: GO CREATE TRIGGER onBookDelete ON books INSTEAD OF DELETE AS DECLARE @book_id int

注意!使用触发器对我来说是必要的!我执行以下任务所需的唯一方法是使用触发器

问题是-我需要一个触发器,在某个表中删除行时调用它。触发器必须做的事情-迭代每个已删除的 行,并根据当前迭代的行值执行一些代码

例如,我做了这个触发器,当我删除一行时它就工作了 凭命令

DELETE FROM books WHERE id=5
触发因素如下:

GO
CREATE TRIGGER onBookDelete ON books
INSTEAD OF DELETE
AS
DECLARE @book_id int
BEGIN

    SET NOCOUNT ON;

    SELECT id FROM deleted
    SET @book_id = (SELECT id FROM deleted)
    PRINT @book_id
    BEGIN 
         DELETE FROM "books-topics" WHERE book_id=@book_id
         DELETE FROM "books-genres" WHERE book_id=@book_id
         DELETE FROM books WHERE id=@book_id
    END
END;
所以,我想要实现的是用相同的任务创建触发器, 但它必须在一次删除多行时起作用,例如

 DELETE FROM books WHERE id=5 OR id=3 OR id=8
我所说的同一任务是指,例如,对每个已删除的行调用以下代码

DELETE FROM "books-topics" WHERE id=DELETEDROW.book_id
DELETE FROM "books-genres" WHERE id=DELETEDROW.book_id 
DELETE FROM books WHERE id=DELETEDROW.book_id

你的老师应该考虑一个更好的例子来代替删除触发器。这个问题首先是关于删除级联的

但是,由于您的任务是使用触发器,因此我建议您改为使用以下内容:

CREATE TRIGGER onBookDelete ON books
INSTEAD OF DELETE
AS
BEGIN

    SET NOCOUNT ON;

    BEGIN TRASACTION
    BEGIN TRY
        DELETE bt
        FROM "books-topics" bt
        INNER JOIN deleted d ON bt.book_id= d.book_id

        DELETE bg
        FROM "books-genres" bg
        INNER JOIN deleted d ON bg.book_id= d.book_id

        DELETE b
        FROM books b
        INNER JOIN deleted d ON b.book_id= d.book_id

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION
    END CATCH
END;

这已经写满了它。请编辑您的问题以描述您试图解决的问题,而不是您试图使用的解决方案。为什么不在删除级联时使用
声明外键呢?如果您想在删除行后执行操作,请在
触发器后使用
。不过,级联删除根本不需要触发器,也不需要单独处理每一行。删除每个已删除行的
,并在DELETE语句中使用join。一旦你这样做了,你就会意识到你可以在一个批中执行这样的语句,而不用使用触发器。请记住,我昨天回答了一个类似这样的问题……哦。我懂了。没有想到在这里使用事务。多谢各位!这有帮助