【问题标题】:Audit table only in specific cases审计表仅在特定情况下
【发布时间】:2017-01-27 12:13:33
【问题描述】:

我有一个包含大量更新和插入的表。我的想法是每天运行一次作业,调用一个程序来对数据中可能出现的表进行一些更正,例如rtrimltrim、删除制表符、换行符等。

我想要的只是将这些作业中的IDOriginal ValueModified Value 登录到一个表上,以跟踪这些变化。

有没有办法做到这一点?

我不介意对其他方式所做的更改,无论如何,我不想在上面浪费资源。

谢谢

【问题讨论】:

  • 在您的程序本身中编写代码来捕获前值和后值。并在审计表中插入。因此,在这种特殊情况下,只有您会进行审核。

标签: sql-server triggers sql-server-2012


【解决方案1】:

有几种方法可以解决这个问题。此方法使用update queryoutput 子句来审核更改。我们将使用特殊表inserted and deleted 来捕获旧值和新值。

如果您计划每天运行更新,您可以将此技术嵌入到 SSIS job 中。 SQL Agent 可以为您按固定时间表运行作业。

样本数据

-- Sample data table.
DECLARE @T TABLE
    (
        ID      INT,
        Value   VARCHAR(255)
    )
;

-- Sample audit table.
DECLARE @T_AUDIT TABLE
    (
        ID          INT,
        OldValue    VARCHAR(255),
        NewValue    VARCHAR(255)
    )
;

-- Let's add some records to experiment with...
INSERT INTO @T
    (
        ID,
        Value
    )
VALUES
    (1, ' abc'),
    (2, 'def '),
    (3, '***    ****')  -- Using 4 spaces to represent a tab.
;

更新查询

-- Update data table, and write changes to audit table.
UPDATE
    @T
SET
    Value = LTRIM(RTRIM(REPLACE(Value, '    ', '')))
OUTPUT
    inserted.ID,
    deleted.Value AS OldValue,
    inserted.Value AS NewValue
INTO
    @T_AUDIT
;

-- Verify result.
SELECT
    *
FROM
    @T_AUDIT
;

这将返回以下内容。我已将空格替换为下划线,以便于阅读。

ID  OldValue        NewValue
1   _abc            abc
2   def_            def
3   ****____****    x

【讨论】:

  • 这正是我想要的。谢谢!
猜你喜欢
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 2011-12-07
  • 2019-03-02
  • 2021-08-31
  • 1970-01-01
相关资源
最近更新 更多