【问题标题】:Triggers: Update table2 with info from table1触发器:使用来自 table1 的信息更新 table2
【发布时间】:2014-08-14 20:16:01
【问题描述】:

使用 SSMS 2008。

我有 2 张桌子:

TABLE1:
PKField (Primary Key)
Field2
Field3

TABLE2:
PKField (Primary Key)
FKField (Foreign Key to Table1.PKField)
Field2
Field3

我需要在 TABLE2 上创建一个触发器来执行此操作:

只要将行插入到 TABLE2 中(此时 Field2 和 Field3 将始终为空),然后更新字段 TABLE2.Field2 和 TABLE2.Field3 基于 TABLE1.Field2 和 TABLE2.Field3 值。

使用 SSMS 2008 我该怎么做?我是触发器等的新手...

谢谢!

【问题讨论】:

  • 在我看来,将数据从 table1 复制到 table2 是一个糟糕的设计。您应该将该数据正确规范化并保存在表 1 中。更新 table1 时会发生什么?您是否还必须更新 table2?
  • 一般来说,写触发器的最好方法是不要写这样的。你能重新考虑使用触发器吗?如果没有,请查找INSTEAD OF INSERT 触发器。
  • @SeanLange 我正在开发一个继承的、预先存在的、非常复杂的应用程序。我明白你在说什么。但是,在这种情况下,不幸的是必须这样做。 (我不必担心 table1 何时更新......在这种情况下。)
  • @gotqn 谢谢。不知道你的意思,但我会调查一下。

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


【解决方案1】:

这是基于您的示例表的粗略草图。

create trigger MyTrigger on Tabel2 INSTEAD OF INSERT AS
    Insert Table2 (PKField, FKField, Field2, Field3)
    select i.PKField
        , i.FKField
        , t.Field2
        , t.Field3
    from Inserted i
    join Table1 t on t.PKField = i.FKField

【讨论】:

    【解决方案2】:

    Here你可以找到更多信息触发器。我建议你在开始做任何事情之前先阅读它。

    在你的情况下,我相信你应该创建INSTEAD OF INSERT 触发器:

    代替

    指定执行 DML 触发器而不是触发 SQL 语句, 因此,覆盖触发语句的操作。 不能为 DDL 或登录触发器指定 INSTEAD OF。最多一个 每个 INSERT、UPDATE 或 DELETE 语句的 INSTEAD OF 触发器可以是 在表或视图上定义。

    例如:

    --Create an INSTEAD OF INSERT trigger on the view.
    CREATE TRIGGER myTrigger on myTable
    INSTEAD OF INSERT
    AS
    BEGIN
      -- do whatever you want here
      -- the code is executed when an insertion is made on the underlying table
    END;
    GO
    

    您可以找到有关INSTEAD OF INSERT 触发器here 的更多信息。

    我想您唯一的问题是如何引用最初插入基础表中的数据?

    答案是使用inserted 表 - read more about it

    【讨论】:

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