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