2012-04-13 59 views
0

我想创建一个触发器,该表格在更新表中的一行之前运行,并在行更新到存档表之前将所有字段写入该行。在更新之前访问行字段所需的正确语法是什么,以便我可以将它们写入我的存档表中?基本的SQL更新触发器

编辑:

所以这应该做我想做的,但它似乎并没有工作。我得到的错误“已经有名为数据库config_SystemSettings对象:

CREATE TRIGGER [config].[UpdateSystemSettings] 

ON [配置] [SystemSetting] UPDATE 以后为 BEGIN

SET NOCOUNT ON; 

SELECT old.settingId, old.campId, old.settingKey, old.settingValue 
into [history].[config_SystemSettings] 
FROM [config].[SystemSetting] AS old 
INNER JOIN deleted AS del ON del.settingId = old.settingId 

END GO

+0

可能重复的[如何做一个BEFORE UPDATE触发器与SQL Server?](http://stackoverflow.com/questions/642822/how-can-i-do-a-before-updated-trigger-with -sql-server) – 2012-04-13 08:28:47

回答

0

SELECT ... INTO总是想创建一个新表格 - 所以请使用INSERT ... SELECT代替:

CREATE TRIGGER [config].[UpdateSystemSettings] 

ON [config].[SystemSetting] AFTER UPDATE AS BEGIN 
SET NOCOUNT ON; 

insert into [history].[config_SystemSettings] (settingId,campId,settingKey,settingValue) 
SELECT old.settingId, old.campId, old.settingKey, old.settingValue 
FROM [config].[SystemSetting] AS old 
INNER JOIN deleted AS del ON del.settingId = old.settingId 

但是您必须首先明确创建[history].[config_SystemSettings]

+0

这写入表中,但似乎写入新值(更新后)而不是旧值。我认为'删除'表包含旧值? – user517406 2012-04-13 09:12:44

+0

对不起,意识到我不得不引用del.SettingId等而不是old.SettingId ....固定 – user517406 2012-04-13 09:14:15

+0

@ user517406 - 事实上,再次查看剩余的查询,不知道为什么你加入到'SystemSetting' - 当然''删除'包含您需要的所有信息。 – 2012-04-13 09:20:48