如何在 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 个表名为 EmpOne
和 NotificationEmp1
,这两个表具有相同的结构和相同的列名,当我将更新记录插入 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 中为每个表创建创建触发器