【问题标题】:Why FOR Trigger does not run befor the action?为什么 FOR 触发器在动作之前不运行?
【发布时间】:2009-04-29 08:55:15
【问题描述】:

我正在尝试在表上编写触发器以避免插入两个未标记为 IsDeleted 的名称。但是选择的第一部分包含插入的部分,因此条件始终为真。我虽然使用 FOR 关键字会导致触发器在 INSERTION 之前运行,但在这种情况下,插入的行已经在表中。我错了还是这就是所有 FOR 触发器的工作原理?

ALTER TRIGGER TriggerName
ON MyTable
FOR INSERT, UPDATE
AS
BEGIN 
    If exist (select [Name] From MyTable WHERE IsDeleted = 0 AND [Name] in (SELECT [Name] FROM INSERTED)
    BEGIN
    RAISERROR ('ERROR Description', 16, 1);
    Rollback;
    END  
END

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    FOR 在数据更改后运行,INSTEAD OF 是我认为你所追求的。

    编辑:正如其他人所说,INSTEAD OF 运行而不是您正在更改的数据,因此您需要在数据有效时插入数据,而不是在无效时停止插入。

    阅读此问题以获得有关触发器类型的更详细说明。

    SQL Server "AFTER INSERT" trigger doesn't see the just-inserted row

    【讨论】:

    • Instead 表示将执行触发器而不是您正在执行的命令
    【解决方案2】:

    FOR 与 AFTER 相同。如果您想“模拟” BEFORE 触发器,请使用 INSTEAD OF,请注意,这与您在正确的 BEFORE 触发器上所期望的不完全一样,即如果您未能提供必要的 INSTEAD 操作,您插入/更新的数据可能会丢失/忽略。

    MSSQL 没有 BEFORE 触发器。

    【讨论】:

      【解决方案3】:

      对于 SQL Server,FOR 在触发它的 SQL 之后运行。

      来自: http://msdn.microsoft.com/en-us/library/ms189799.aspx

      为 |之后

      AFTER 指定 DML 触发器 仅在所有操作时触发 在触发 SQL 中指定 语句已成功执行。 所有参考级联动作和 约束检查也必须成功 在此触发器触发之前。

      AFTER 是 FOR 时的默认值 只指定了关键字。

      AFTER 触发器 不能在视图上定义。

      【讨论】:

        【解决方案4】:

        我最近实际上遇到了类似的问题,并找到了一种很酷的方法来处理它。我有一张表,其中一个 id 可以有几行,但其中只有一个可以标记为主要的。

        在 SQL Server 2008 中,您可以像这样创建部分唯一索引:

        create unique index IX on MyTable(name) where isDeleted = 0;
        

        但是,您可以在 SQL Server 2005 中做更多的工作来完成它。诀窍是创建一个仅显示未删除行的视图,然后在其上创建一个唯一的聚集索引:

         create view MyTableNotDeleted_vw
         with schema_binding /* Must be schema bound to create an indexed view */
         as
         select name 
         from dbo.MyTable /* Have to use dbo. for schema bound views */
         where isDeleted = 0;
        
         GO
        
         create unique clustered index IX on MyTableNotDeleted_vw ( name );
        

        这将有效地创建一个仅影响尚未删除的行的唯一约束,并且可能比自定义触发器执行得更好!

        【讨论】:

          猜你喜欢
          • 2011-04-01
          • 2019-03-12
          • 2018-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多