检查谁在MS SQL Server上的表中执行插入

时间:2013-12-10 10:27:19

标签: sql sql-server

我想检查哪个用户在MS SQL Server 2008上的特定表中执行了插入。我知道存储了一些日志信息,但我不知道如何访问它。如果我还需要其他信息,我会非常感谢我提供有关我的问题的具体信息,以及一般指针在哪里以及要查找什么。

谢谢!

3 个答案:

答案 0 :(得分:5)

您是在谈论从事务日志中检索这个吗?

这并不理想,因为您无法保证相关行在活动日志中仍然可用且查询效率较低,但以下内容会执行此操作(返回USER_NAME()而不是虽然可能更有用SUSER_NAME()

dbo.X更改为您的实际表名。

DECLARE @allocation_unit_ids TABLE (
  allocation_unit_id BIGINT PRIMARY KEY )

INSERT INTO @allocation_unit_ids
SELECT allocation_unit_id
FROM   sys.allocation_units au
       JOIN sys.partitions p
         ON au.container_id = CASE
                                WHEN au.type IN ( 1, 3 ) THEN p.hobt_id
                                WHEN au.type = 2 THEN p.partition_id
                              END
WHERE  p.object_id = OBJECT_ID('dbo.X');

WITH L1
     AS (SELECT [Transaction ID],
                [Begin Time],
                [End Time],
                [Transaction SID],
                CASE
                  WHEN Operation = 'LOP_INSERT_ROWS'
                       AND AllocUnitId IN (SELECT allocation_unit_id
                                           FROM   @allocation_unit_ids) THEN 1
                END AS I
         FROM   sys.fn_dblog(NULL, NULL) l),
     L2([Transaction ID], TransactionBegin, TransactionEnd, sid)
     AS (SELECT [Transaction ID],
                MAX([Begin Time]),
                MAX([End Time]),
                MAX([Transaction SID])
         FROM   L1
         GROUP  BY [Transaction ID]
         HAVING 1 = MAX(I))
SELECT TransactionBegin,
       TransactionEnd,
       p.name AS PrincipalName
FROM   L2
       JOIN sys.database_principals p
         ON p.sid = L2.sid 

答案 1 :(得分:3)

您可以尝试使用ApexSQL Log来读取事务日志。试用期为14天,添加可用数据源并仅过滤INSERT语句。最重要的是,您可以允许以读取友好格式查看事务日志数据

您还可以查看未记录的函数fn_dblogDBCC LOGINFO命令。

编辑:忘记为您提供工具链接:http://www.apexsql.com/sql_tools_log.aspx

免责声明:我为ApexSQL工作,担任支持工程师

答案 2 :(得分:1)

最简单的解决方案是使用SUSER_SNAME()创建计算列。但是,这个计算列会反映甚至更新(但另一方面,它只是添加一个列)

在测试数据库中尝试此示例:

CREATE TABLE [dbo].[logging_test]
(
  [logging_test_id] [int] IDENTITY(1, 1)
                          PRIMARY KEY
                          NOT NULL ,
  [SomeData] [nvarchar](500) NULL ,
  [Audit_UpdatedBy] AS ( SUSER_SNAME() ) ,
  [Audit_InsertedBy] NVARCHAR(200) NULL
)

INSERT INTO [dbo].[logging_test] ( [SomeData] ) VALUES ( 'foo' )

SELECT * FROM [dbo].[logging_test]

或者您可以在触发后创建更新Audit_InsertedBy列(从CREATE TRIGGER到END运行所有内容......由于某种原因,代码在此处拆分)

CREATE TRIGGER dbo.logging_test_InsertTrigger ON dbo.logging_test
AFTER INSERT

AS     BEGIN
        SET NOCOUNT ON;

    UPDATE  dbo.logging_test
    SET     Audit_InsertedBy = SUSER_NAME()
    FROM    dbo.logging_test lt
            INNER JOIN INSERTED i ON i.logging_test_id = lt.logging_test_id

END