在同一个表中更新/插入触发器

时间:2012-06-12 23:56:17

标签: sql-server-2008 tsql triggers

我对此有些新意,但想写一些第一个简单的触发器。 如果我有字段A,B,C的mytable。 当用户插入或更新A和B时,我想通过触发器更新C = A + B. 会容易吗?感谢

1 个答案:

答案 0 :(得分:2)

这是一个触发器,可以按照你的要求进行操作。由于mytable中缺少ID列,因此无法仅为已更新的行指定update c(即每次插入/更新时每行都将重新计算c的值)。

CREATE TRIGGER mytrigger
ON mytable
FOR INSERT, UPDATE
AS
    UPDATE mytable
    SET    c = COALESCE(a, 0) + COALESCE(b, 0)

这将是计算列的合适候选者:

CREATE TABLE mytable
  (
     a INT,
     b INT,
     c AS COALESCE(a, 0) + COALESCE(b, 0)
  )

修改:ID列的示例仅更新c更新/插入的行:

CREATE TRIGGER mytrigger
ON mytable
FOR INSERT, UPDATE
AS
    UPDATE mytable
    SET    c = COALESCE(a, 0) + COALESCE(b, 0)
    WHERE  ID IN (SELECT ID
                  FROM   inserted)

我已经创建了一个SQL Fiddle,你可以在这里看到这个。

让您了解SQL Fiddle示例:

  1. 创建架构,添加一些示例数据,然后添加触发器定义 (所以c此时未填充)。
  2. 从表格中选择,以便查看示例值。
  3. 更新一行,然后再次从表格中选择(您可以看到c 现已填充)。
  4. 插入新行,然后再次从表中选择所有内容(c 已填充此新行。)
  5. 更多地解释一下这是如何工作的 - 在触发器执行期间,SQL服务器(我现在假设你正在使用它)创建了两个临时表inserteddeleted受影响的行的副本 - 如果我们需要从中获取数据,我们可以加入或从这些表中选择;在这种情况下,只需获取受更新/插入操作影响的ID列表,然后仅更新c这些行。有关详细信息,请参阅this MSDN article