【问题标题】:Need to filter records from AUDIT table for a particular column需要从 AUDIT 表中过滤特定列的记录
【发布时间】:2015-05-19 19:25:03
【问题描述】:

PFB scipts

Step-1(审核表)

CREATE TABLE AuditTest
(
    ID INT
    ,col1 NVARCHAR(MAX)
    ,col2 NVARCHAR(MAX)
    ,col3 NVARCHAR(MAX)
    ,col4 NVARCHAR(MAX)
    ,[Action] VARCHAR(10)
    ,[Date] DATETIME DEFAULT GETDATE()
)

Step-2(交易表)

CREATE TABLE Test11
(
    ID INT IDENTITY
    ,col1 NVARCHAR(MAX)
    ,col2 NVARCHAR(MAX)
    ,col3 NVARCHAR(MAX)
    ,col4 NVARCHAR(MAX)
)

Step-3(事务表上的更新触发器)

CREATE TRIGGER trgAudit ON Test11
AFTER UPDATE
AS 
BEGIN
INSERT INTO AuditTest(ID
,col1
,col2
,col3
,col4
,[Action]
)
SELECT d.ID,d.col1,d.col2,d.col3,d.col4,'o' FROM DELETED d
INSERT INTO AuditTest(ID
,col1
,col2
,col3
,col4
,[Action]
)
SELECT i.ID,i.col1,i.col2,i.col3,i.col4,'n' FROM INSERTED i
END

Step-4(插入和更新事务表)

insert into Test11
select 'a','a','a','a'

UPDATE Test11
SET col1 = 'b'
WHERE ID = 1


UPDATE Test11
SET col2 = 'z'
WHERE ID = 1

需要从表 AuditTest 中选择所有新记录(WHERE ACTION = 'N') 如果仅对“COL1”列进行任何更新

注意:不要在触发器中添加任何脚本。

提前致谢, 阿尼尔

【问题讨论】:

  • 如果您希望在 AuditTest 表中添加一个作为审计顺序标识的新字段,那么您可以与之前的审计记录进行比较,并查看列中的特定值是否已更改。在这种情况下,我总是执行以下一项或两项操作...将触发代码更改为仅对某些更改进行插入,或者添加新的操作代码,以便将更新的列隐藏在操作代码中。 n1 n2 n3 n4 n24 n14 n0

标签: sql-server sql-server-2012


【解决方案1】:

对于每个ID,这将为您提供仅在col1 上完成的所有更新

WITH cte1 AS
 ( SELECT ROW_NUMBER() OVER (Partition BY ID ORDER BY DATE ASC, ACTION DESC) RowNum,
          *
   FROM AuditTest 
)
, cte2 AS 
 ( SELECT ROW_NUMBER() OVER (Partition BY ID ORDER BY DATE ASC, ACTION DESC) RowNum,
          *
   FROM AuditTest 
)
SELECT cte2.ID, 
       cte2.col1, 
       cte2.col2,
       cte2.col3, 
       cte2.col4,
       cte2.action,
       cte2.date
FROM cte1, cte2
WHERE cte2.RowNum > cte1.RowNum AND 
      cte2.id = cte1.id AND 
      cte2.col1 != cte1.col1 AND 
      cte2.col2=cte1.col2 AND
      cte2.col3=cte1.col3 AND
      cte2.col4=cte1.col4 AND
      cte2.Date = cte1.Date

一次运行这些查询(在更新语句之间等待几秒钟)以测试解决方案

TRUNCATE TABLE Test11;
TRUNCATE TABLE AuditTest; 
insert into Test11
select 'a','a','a','a'
insert into Test11
SELECT 'b', 'b', 'b', 'b'

UPDATE Test11
SET col1 = 'b'
WHERE ID = 1;

UPDATE TEST11
SET col1='c'
WHERE ID = 2;


UPDATE Test11
SET col2 = 'z'
WHERE ID = 1;

UPDATE Test11 
SET col2='z'
WHERE ID=2;

UPDATE Test11 
SET col1='bd'
WHERE ID=2; 

结果

1   b   a   a   a   n   2015-05-19 22:33:15.430
2   c   b   b   b   n   2015-05-19 22:33:20.690
2   bd  z   b   b   n   2015-05-19 22:35:22.427

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多