如何在 SQL Server 2008 上创建插入更新触发器

Posted

技术标签:

【中文标题】如何在 SQL Server 2008 上创建插入更新触发器【英文标题】:How do I create Insert Update trigger on SQL Server 2008 【发布时间】:2011-07-08 04:40:29 【问题描述】:

您好,我有 2 个表名为 EmpOneNotificationEmp1,这两个表具有相同的结构和相同的列名,当我将更新记录插入 EmpOne 时,我想使用触发器在 NotificationEmp1 表中插入更新记录

【问题讨论】:

需要一些信息,比如表的键是什么,列是什么,是否有任何特殊列,如 IDENTITY 或计算列,您使用的是什么版本的 SQL Server...跨度> 你的场景没有什么不寻常的地方,你也没有提供任何信息,所以你还不如用谷歌搜索一下。 tkerwood 的答案只是您从 Books OnLine (BOL) 获得的骨架。 【参考方案1】:

好吧,我看不到保持表副本完全同步的触发器的意义,而且你提供的规格非常模糊,但我会试一试。

CREATE TRIGGER dbo.tr_EmpOne
ON dbo.EmpOne
FOR INSERT, UPDATE
AS
BEGIN
    SET NOCOUNT ON;

    INSERT dbo.NotificationEmp1(columns)
        SELECT columns 
        FROM inserted AS i
        WHERE NOT EXISTS
        (SELECT 1 FROM deleted WHERE key_column = i.key_column);

    UPDATE n
        SET col1 = i.col1,
            col2 = i.col2 --, etc etc
    FROM dbo.NotificationEmp1 AS n
    INNER JOIN inserted AS i
    ON i.key_column = n.key_column
    INNER JOIN deleted AS d
    ON i.key_column = d.key_column;
END
GO

现在不要忘记,当从 EmpOne 中删除行时,您将需要一些东西来从 NoticiationEmp1 中删除行。此外,这里根本没有错误处理 - 作为示例(这不会引发错误),考虑直接从 NotificationEmp1 中删除一行,然后在 EmpOne 中更新的情况,它将通过裂缝这里...

【讨论】:

【参考方案2】:

在触发器中,您有称为“已插入”和“已删除”的逻辑(概念)表,其中包含已修改的记录。所以你可以从这些中插入记录。

CREATE TRIGGER [dbo].[Employee_Write_Audit] 
   ON  [dbo].[EmpOne]
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- all new inserted records and updated.
    Insert into NotificationEmp1 select * from Inserted
    -- just the deleted ones not the updated rows that are being removed.
    Insert into NotificationEmp1 select * from Deleted where EmpOneId not in  (select EmpOneId from inserted)
END

【讨论】:

以上是关于如何在 SQL Server 2008 上创建插入更新触发器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Sql Server 2008 获取用于插入到 select 中的 scope_identity 列表?

在 VB 2010 的数据表中插入新列时,如何更新 SQL Server 2008 数据库?

如何在 VS2008 和 SQL Server CE 上基于现有的 .sdf 文件创建空本地数据库

在 SQL Server 2008 R2 中为每个表创建创建触发器

sql server 2008中“Merge”子句的性能如何?

SQL Server 2008:插入不完整的数据并更新它