“FOR UPDATE ... SELECT * FROM DELETED”触发复制到具有两个额外列的表

时间:2017-12-02 20:53:35

标签: sql-server

我有一个非常简单的触发器,可以复制

的当前行
  • AuthorsAuthorID(PK)AuthorNameBio

  • AuthorsHistoryHistoryID(PK)AuthorIDAuthorNameBiohWhen(dateTime)

hWhen使用getDate()填写其值。

CREATE TRIGGER [dbo].[AuthorHistory]
ON [dbo].[B_Authors]
FOR UPDATE
AS
    INSERT INTO B_AuthorsHistory 
        SELECT * 
        FROM deleted

还有更多列,但这一点并不重要。所有列都是相同的类型,相同的空值设置,相同的默认值,而不是PK更改。

它运作完美,但今天我想添加一列。

  • 我尝试将其添加到Authors,这会立即引发错误,即触发器中的列列表。 (我正在使用Select *
  • 我首先将该列添加到AuthorsHistory,再次尝试Authors,并且直接提到触发器时出现了另一个错误。

我找到了分辨率,删除了触发器,调整了列,添加了触发器,但我还必须暂时从hWhen删除AuthorsHistory(目前这不是问题,仍在构建它)。

另一个选择可能是特定于列名和值。 我是在代码中执行此操作,但如果可以避免,我会更喜欢更新一件事。

问题:有没有办法用SELECT *做这个?**我在其他表上也有相同的触发器(即“Products ==> ProductsHistory”)。

1 个答案:

答案 0 :(得分:1)

正如我所看到的,向两个表添加新列的唯一方法就是在一个查询中执行以下操作:

;disable trigger dbo.AuthorHistory on dbo.B_Authors;

alter table dbo.B_Authors add NewColumn int null;

alter table dbo.B_AuthorsHistory add NewColumn int null;

;enable trigger dbo.AuthorHistory on dbo.B_Authors;

但是如果您的系统负载较高,如果任何其他事务在查询过程中更改dbo.AuthorsHistory中的数据,您可能会在dbo.Authors中丢失一些数据。