“FOR UPDATE ... SELECT * FROM删除” 触发复制到表有两个额外的列
我有一个非常简单的触发器,复制当前行的“FOR UPDATE ... SELECT * FROM删除” 触发复制到表有两个额外的列
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
,并且它直接提到触发器抛出了一个不同的错误。
我找到解决方法,删除了扳机,调整列,添加了扳机,但我也不得不删除从AuthorsHistory
暂时hWhen
(这是不是现在的问题,还是构建它)。
另一种选择很可能是针对列名和值。 我在代码中这样做,但我喜欢这样的想法,即使我可以避免更新,也无需更新。
问题:有没有一种方法,我可以用SELECT * **我有一个相同的触发(即“Products ==> ProductsHistory
”)上的其他表也这么做?
回答:
依我之见,一个新的列添加到两个表,从而使触发不会失败的唯一办法,是做一个查询这样的:
;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.Authors
中的数据,则可能会丢失dbo.AuthorsHistory
中的一些数据。
以上是 “FOR UPDATE ... SELECT * FROM删除” 触发复制到表有两个额外的列 的全部内容, 来源链接: utcz.com/qa/258285.html