插入触发器以消除敏感信息

dmc*_*dmc 7 sql-server-2008 sql-server

供应商系统(即在我的控制之外)正在将一行插入到我控制的数据库中的表中。此插入中的一列将包含我不希望出现在数据库中的敏感信息。

如果我使用INSTEAD OF INSERT触发器将这一列清空,敏感信息是否仍会出现在事务日志中?

Mar*_*ith 7

是的,这将阻止信息显示在日志中。事务日志只需要记录足够的信息即可恢复实际写入数据页的行。您可以从sys.fn_dblog如下使用中看到这一点。

CREATE TABLE dbo.T
  (
     X      int CONSTRAINT PK PRIMARY KEY,
     String varchar(50) NULL
  )

GO

CHECKPOINT;

INSERT INTO dbo.T
VALUES      (1,
             'Private and Confidential')

/*Without INSTEAD OF trigger this phrase found in log record*/
SELECT CASE
         WHEN [Log Record] LIKE '%Private and Confidential%' THEN 1
         ELSE 0
       END,
       [RowLog Contents 0]
FROM   sys.fn_dblog(NULL, NULL)
WHERE  Operation = 'LOP_INSERT_ROWS'
       AND AllocUnitName = 'dbo.T.PK'

GO

CREATE TRIGGER TR
ON dbo.T
INSTEAD OF INSERT
AS
  BEGIN
      SET NOCOUNT ON;

      INSERT INTO dbo.T
                  (X)
      SELECT X
      FROM   INSERTED
  END

go

CHECKPOINT;

INSERT INTO dbo.T
VALUES      (2,
             'Private and Confidential')

GO

/*With INSTEAD OF trigger this phrase no longer found in log record*/
SELECT CASE
         WHEN [Log Record] LIKE '%Private and Confidential%' THEN 1
         ELSE 0
       END,
       [RowLog Contents 0]
FROM   sys.fn_dblog(NULL, NULL)
WHERE  Operation = 'LOP_INSERT_ROWS'
       AND AllocUnitName = 'dbo.T.PK' 
Run Code Online (Sandbox Code Playgroud)

INSERTED伪表的构建发生在,tempdb因此该信息可能会顺便出现在那里的数据文件中。