【问题标题】:Creating a trigger to update multiple records after insert sql server 2008在插入 sql server 2008 后创建触发器以更新多条记录
【发布时间】:2013-12-19 22:12:32
【问题描述】:

嗯,基本上我需要这个触发器在用户将多条记录插入数据库后工作。这样当插入一个 optionID 为 0 并且 IsoptionalID = 1 时,则设置 OptionID = NULL

CREATE TRIGGER ThisDatabase
   ON  OtherTable
  AFTER INSERT
AS 
BEGIN

DECLARE @OPTIONID INT
SET @OPTIONID = OtherTable.OPTIONID

DECLARE @ISoptional INT
SET @ISoptional = OtherTable.ISoptional

        CASE @optionID WHEN  0 and @ISoptional = 1 set update  OtherTable set optionid = null end
END

我也不确定案件本身。

提前谢谢你

【问题讨论】:

  • 触发器应该做什么?您似乎也缺少一些代码..
  • 表的定义是什么?包括PK定义?

标签: sql sql-server sql-server-2008


【解决方案1】:

这取决于表的关键字段,但 SQL Server 触发器始终对正在修改的整个数据集(插入、更新或删除)起作用。所以触发器更像是:

CREATE TRIGGER ThisDatabase
   ON  OtherTable
  AFTER INSERT
AS 
BEGIN
SET NOCOUNT ON

   UPDATE ot
   SET    ot.OptionID = NULL
   FROM   OtherTable ot
   INNER JOIN INSERTED ins
           ON ins.KeyField = ot.KeyField
   WHERE   ins.OptionID = 0
   AND     ins.IsOptional = 1

END

INSERTED 表包含已插入或已更新的行(当前版本)。
DELETED 表包含已删除或已更新(旧版本)的行。

因此,INSERTED 和 DELETED 表被预过滤为仅更改的记录,但它们不可更新(因为事件已经发生,因为这是一个 AFTER 触发器并且 SQL Server 没有 BEFORE 触发器)所以你需要在真实表上执行 UPDATE。

【讨论】:

  • 那么您指定的键值和插入的键值是什么?
  • 不是关键值,关键字段。您需要根据唯一标识每一行的字段将 INSERTED 表连接到真实表。此外,INSERTED 表正是该名称。上面代码中唯一需要改变的是“OtherTable”和“KeyField”。
【解决方案2】:

不清楚你想做什么,但这里有一个骨架。请注意:

  • 在受影响的表上创建触发器(不是Other table
  • 您当然可以更新另一个表作为触发器的结果。这通常通过连接来完成。
  • 使用inserteddeleted 伪表来识别已插入、更新或删除的记录。

    CREATE TRIGGER TR_TableBeingInsertedInto
       ON  TableBeingInsertedInto
       AFTER INSERT
    AS 
    BEGIN
         UPDATE OtherTable
         -- What you actually want to do here isn't clear to me
             SET OtherTable.OPTIONID = 
                 CASE i.OptionID
                   WHEN 0 THEN NULL
                   ELSE OtherTable.OPTIONID
                 END
             FROM OtherTable
                 -- Inserted has the same schema as TableBeingInsertedInto
                 INNER JOIN INSERTED i                  
                    ON OtherTable.SomeCommonKey = i.SomeCommonKey;
    END
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多