如何更改此触发器以包含表格中的所有字段?

时间:2013-06-24 22:59:35

标签: sql-server database-design

我在SQL Server中有两个表:

  • PersonH​​istory

每当有人更新Person表时,我都会运行此触发器将记录存储在PersonHistory表中:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [TU_Person]
ON [Person]
AFTER UPDATE
AS
SET NOCOUNT ON

INSERT
INTO    [PersonHistory]
        ([Field1], [Field2],[Field3],[Field4],[Field5],[Field6], [LastUpdated], [LastUpdatedBy])
SELECT [Field1], [Field2],[Field3],[Field4],[Field5],[Field6], [LastUpdated], [LastUpdatedBy]
FROM    deleted

问题是我不断向此表添加字段,忘记将字段添加到此触发器。无论如何重写此触发器只是说insert *Select *而不是逐个列出所有字段名称?

2 个答案:

答案 0 :(得分:1)

INSERT     INTO [PersonH​​istory]     SELECT * FROM deleted

如果列的顺序相同,则可以使用

可以在开头或结尾添加其他字段,方法是选择状态更改以包含日期字段,例如:

INSERT
INTO    [PersonHistory]
SELECT *, getdate() FROM deleted

这里更大,更危险的风险是对一个表而不是另一个表进行更新,可能导致此触发器出错。在我看来,这将是一个比现场环境中缺少的领域更大的邪恶。

答案 1 :(得分:1)

INSERT 
INTO [PersonHistory]
SELECT
*
FROM 
deleted
WHERE
inserted.[Common_Field]=deleted.[Common_Field]

但始终建议明确提及字段名称。