【问题标题】:SQL - Trigger that inserts data in to a table only if specific column have been updatedSQL - 仅当特定列已更新时才将数据插入表中的触发器
【发布时间】:2016-11-16 01:33:51
【问题描述】:

我正在尝试创建一个触发器,该触发器仅在特定列已更新(而不是整个表)时才会插入到表中。

例如,我有 2 个名为 tbl.Atbl.A_History 的表:

tbl.A 有 5 列:id、name、location、age、gender

我只想在位置或名称已更改的情况下将更新的行插入历史记录,如果 id、年龄、性别得到更新、删除、插入,则不执行任何操作。

我还希望能够区分位置和名称。


  • 如果位置改变插入location have been changed

  • 如果名称更改插入name have been changed


我已经尝试了几件事,但没有运气。

【问题讨论】:

  • 在哪个数据库中?微软?甲骨文?

标签: sql sql-server tsql triggers


【解决方案1】:
CREATE TRIGGER trigger_name ON tbl.A
FOR UPDATE
AS
IF ( UPDATE(location) OR UPDATE(name))
BEGIN
--  your sql here
END

【讨论】:

  • 试试上面的查询。其中触发器仅在对名称或位置列执行更新操作时触发
  • 感谢这似乎完成了部分工作。以及如何根据其中的哪些已更新将不同的字符串插入到变量中?
  • 您的意思是将字符串添加到 sql 变量或其他东西。
  • 请注意,如果列在更新语句中,UPDATE 将返回 true。大多数时候,人们想要知道值是否真的发生了变化。要确定您需要比较插入和删除的值。
【解决方案2】:
CREATE TRIGGER Test_Trg_01
ON Test
AFTER Update
AS
BEGIN
  IF update(name)
    INSERT INTO Test_Log SELECT id, 'name updated' AS LogMessage FROM inserted;

  IF update(country)
    INSERT INTO Test_Log SELECT id, 'country updated' AS LogMessage FROM inserted;
END

【讨论】:

  • 请注意,如果列在更新语句中,UPDATE 将返回 true。大多数时候人们想要知道值是否真的改变了。要确定您需要比较插入和删除的值。
  • 是的,你是对的。我忘记了这一点......应该可以这样:INSERT INTO Test_Log SELECT id, 'name updated' AS LogMessage FROM (SELECT ID, Name FROM inserted EXCEPT SELECT ID, Name FROM deleted) AS x;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 2021-01-12
  • 2019-08-16
  • 1970-01-01
相关资源
最近更新 更多