我有一个非常简单的触发器,可以复制
的当前行 Authors
:AuthorID(PK)
,AuthorName
,Bio
AuthorsHistory
:HistoryID(PK)
,AuthorID
,AuthorName
,Bio
,hWhen(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
”)。
答案 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
中丢失一些数据。