【问题标题】:How can I fire a trigger BEFORE a delete in T-SQL 2005?如何在 T-SQL 2005 中删除之前触发触发器?
【发布时间】:2009-02-05 14:28:48
【问题描述】:

如何在 T-SQL 2005 中删除之前触发触发器? FOR 实际上在事件之后触发,并且它们似乎在 TRIGGER 函数中没有 BEFORE 参数。 INSTEAD OF 不是我想要的。 我需要在删除记录之前触发。 有什么想法吗?

【问题讨论】:

  • 谢谢汤姆、米奇和史蒂文

标签: sql sql-server-2005 tsql


【解决方案1】:

您可以使用 INSTEAD OF 选项,只需显式删除末尾的行。例如:

CREATE TRIGGER dbo.My_Table_Delete_Instead_Of_Trigger
ON dbo.My_Table
INSTEAD OF DELETE
AS
BEGIN

     -- Do some stuff here

     DELETE T
     FROM DELETED D
     INNER JOIN dbo.My_Table T ON T.PK_1 = D.PK_1 AND T.PK_2 = D.PK_2
END

假设主键由列 PK_1 和 PK_2 组成。

【讨论】:

  • 这不会再次触发触发器吗?
【解决方案2】:

你不能。但是您可以在 AFTER DELETE 触发器中执行回滚。

【讨论】:

    【解决方案3】:

    你不能。您可以做的是检查 DELETE 表并在需要时撤消删除。

    这是事件的顺序:

    • 向 SQL Server 发送 DELETE 命令
    • 项目已从表格中移除
    • OnDelete 触发器触发执行您的
    • 逻辑如果逻辑失败/通过/无论如何,撤消删除

    【讨论】:

    • 这对“删除前”触发器的最常见用例没有帮助 - 级联删除 - 这让我不知道你 用 on- 做什么删除。
    • 我通常使用 OnDelete 触发器来创建一个元素在给定时间被用户删除的历史条目。
    • 不依赖应用程序行为的自定义审核。我喜欢。 +1 好主意。
    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2017-08-28
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多