【问题标题】:SQL trigger using old and updated values使用旧值和更新值的 SQL 触发器
【发布时间】:2014-09-16 13:44:52
【问题描述】:

我不知道如何将旧值和更新值从 SQL 触发器插入到表中。假设我有一个表 OrigTable 和一个表 NewTable。当我运行 SQL 触发器更新语句时,我希望将 NewTable 中的列名 Col1 更新为 UPDATE 语句中的新值,其中 Col1 值等于在 NewTable Col1 中更改的旧值。

例如,语句将是 UPDATE OrigTable SET Col1 = '10' WHERE Col1 = '2' 并且在此语句之后,触发器将触发并在 NewTable 上运行 UPDATE 语句,并将 NewTable 中的 Col1 在每个位置设置为 10 Col1 等于 2。

【问题讨论】:

  • 你用的是sql-server还是mysql?它们不是同一件事。另外,为什么需要同时捕获旧值和新值?为什么不只捕获旧值。新值将位于基表中或审计表的下一行中。

标签: mysql sql sql-server


【解决方案1】:

基本上你可以这样做:

UPDATE NewTable
SET Col1 = (SELECT TOP 1 inserted.Col1 FROM inserted)
WHERE NewTable.Col1 = (SELECT TOP 1 deleted.Col1 FROM deleted)

如果您一次只更新 1 行,这将起作用。 SQL 触发器每个更新查询只触发一次。所以我建议你使用 Sql-Cursor 来做这件事。试试这个:

DECLARE @newValue nvarchar(max),
        @oldValue nvarchar(max)
DECLARE c1 CURSOR LOCAL FAST_FORWARD FOR
SELECT inserted.Col1, deleted.Col1
FROM inserted
JOIN deleted ON deleted.InsertYourPrimaryKeyHere = deleted.InsertYourPrimaryKeyHere
OPEN c1
FETCH NEXT FROM c1 INTO @newValue, @oldValue
WHILE @@FETCH_STATUS = 0 
BEGIN
  BEGIN
    UPDATE NewTable
    SET NewTable.Col1 = @newValue
    WHERE NewTable.Col1 = @oldValue
  END
  FETCH NEXT FROM c1 INTO @newValue, @oldValue
END
CLOSE c1
DEALLOCATE c1

将此代码添加到 OrigTable 上的插入触发器中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2021-04-24
    • 1970-01-01
    • 2021-04-04
    • 2015-06-26
    相关资源
    最近更新 更多