【问题标题】:Can SQL server instead of update force insert a new rowSQL Server可以代替更新强制插入新行吗
【发布时间】:2014-08-12 18:43:27
【问题描述】:

是否可以在 SQL Server 2008+ 中强制将表上的 UPDATE 语句转换为 INSERT 语句,从而使用旧列和更新列创建新行?

【问题讨论】:

  • 我认为这是通过MERGE 语句完成的。
  • @MikeChristensen 是的,我知道我可以做到这一点,但我想通过不更改应用程序中的现有查询来实现这一点,只需调整接收特定表的查询方式即可。跨度>
  • Instead of update 触发器?
  • 我认为OP指的是SCD机制,
  • @TMNT2014 是的,我需要创建当前进程的版本控制,我需要一个简单快速的解决方案。

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


【解决方案1】:

是的,这是INSTEAD OF UPDATE TRIGGER 的典型场景。

在您的表上创建以下触发器,它将为您的表上的每个更新插入一行。您可以在触发器中包含更多逻辑,但这只是一个基本定义,只是为了给您一些想法。

在您的 INSTEAD of UPDATE 触发器中,您将可以访问两个系统表 Inserteddeleted

Inserted 表将保存由 Update 语句更新的行的新值。

Deleted 表将保存由 Update 语句更新的行的旧值。

演示触发器

CREATE TRIGGER tr_Table_Instead_Of_Update
ON TABLE_NAME
INSTEAD OF UPDATE
AS
BEGIN
 SET NOCOUNT ON;

 INSERT INTO TABLE_NAME(Col1, Col2 , Col3)
 SELECT Col1, Col2 , Col3
 FROM inserted 

END

【讨论】:

  • 我知道这对UPDATE Col1,Col2,Col3 语句是如何工作的,但它会将Col3 设置为默认值而不是UPDATE Col1,Col2 语句中的旧值吗?
  • 如果一个列没有在更新语句中被更新,它将出现在inserteddeleted 表中,但它的值将是相同的。
  • 感谢您的澄清,这正是我所需要的。
  • 没问题,很高兴它有帮助。
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多