【问题标题】:Basic SQL update trigger基本 SQL 更新触发器
【发布时间】:2012-04-13 17:05:33
【问题描述】:

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

编辑:

所以这应该做我想要的,但它似乎不起作用。我收到错误“数据库中已经有一个名为 config_SystemSettings 的对象:

CREATE TRIGGER [config].[UpdateSystemSettings]

开启 [配置].[系统设置] 更新后 作为 开始

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

结束 去吧

【问题讨论】:

标签: sql tsql


【解决方案1】:

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]。

【讨论】:

  • 这写入表,但似乎写入新值(更新后)而不是旧值。我认为“已删除”表包含旧值?
  • 抱歉,我意识到我必须引用 del.SettingId 等而不是 old.SettingId....fixed
  • @user517406 - 事实上,再次查看您的查询的其余部分,完全不知道您为什么要加入SystemSetting - 当然deleted 包含您需要的所有信息。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 2011-06-03
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多