仅在特定情况下的审计表

时间:2017-01-27 12:13:33

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

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

我想要的是仅在这些作业的IDOriginal ValueModified Value上登录,以跟踪这些变化。

有办法吗?

我不介意在其他方面做出的改变,无论如何,我不想浪费资源。

谢谢

1 个答案:

答案 0 :(得分:1)

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

如果您计划每天运行更新,可以将此技术嵌入SSIS jobSQL 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