2016-12-02 71 views
0

我在我的Datamart中有一张桌子;用户应该只从该表中读取...我查了一下,桌子的数量下降了,也就是说,某人,SP或工作人员删除了记录,我感觉这不是第一次。如何追踪未来的删除?

我的问题:什么是侵入性更小,更简单的跟踪方式:我不想阻止这种情况;我想得到这个人的名字,或者SP/Job的名字,以及它发生的确切时间。

我使用:的Microsoft SQL Server 2012(SP1) - 11.0.3000.0(X64):商业智能版在Windows NT 6.2(64位)(编译9200:)(管理程序)

我有'简单的'恢复模式,我假设过去追踪它是非常具有挑战性的,所以我很高兴在将来检索这些信息。

+1

打开CDC(取决于您的SQL Server版本)或添加触发器。如果你已经发布了SQL Server登录,那么可能无法找出它的真实身份。如果您使用的是Windows身份验证,那么您有更好的机会 –

+0

这是[SQL Server审核](https://msdn.microsoft.com/en-us/library/cc280386.aspx)的工作,自2008年起可用。选项是启用更改跟踪,它比CDC更轻,并且可用于所有SQL Server版本。虽然 –

+0

我没有看到相同的信息,但我看到cdc不会为您提供在特定表格上删除一行的确切登录名或sp/job。我能做到这一点的唯一方法就是用我想到的触发器。我试图找到一个例子。 “ – Chicago1988

回答

0

您可以在表中使用AFTER DELETE触发器和日志中删除值到历史记录表与用户信息和删除时间等如下

CREATE TRIGGER dbo.myTableDeleteTrigger 
    ON dbo.myTable 
AFTER DELETE 
AS 

    INSERT INTO myTableHistory (
    -- columns from myTable 
    DeletedDate, 
    DeletedByUserId 
) 
    SELECT 
    -- delete column values from Deleted temp table 
    GETDATE(), 
    USER_ID() 
    FROM Deleted 

GO 

我使用了类似的trigger to log data changes,用于在SQL数据库表中插入,更新和删除DML,如我在参考教程中所述

+0

伟大的答案!我使用了USER_ID(),并且我在表格中插入了'11'...不确定这是一个人还是一份工作......我怎么能确切知道谁是'11'? – Chicago1988

0

以下代码将为您数据库中的每个表生成触发器。

注意:您可以排除那些你不想在CTE

;WITH CTE AS(
SELECT TAB.name FROM SYS.objects TAB 
where TAB.type='U' 
) 
SELECT ' 
GO 

CREATE TRIGGER [dbo].[TRG_'+NAME+'_LOG] ON [dbo].['+NAME+'] 
FOR UPDATE,DELETE 
AS 
INSERT INTO LOG_'+NAME+' 
(LOG_DTE,'+(SELECT STUFF((
SELECT ', '+ COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=NAME FOR XML PATH('')),1,1,''))+') 



    SELECT getdate(),'+(SELECT STUFF((
SELECT ', '+ COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=NAME FOR XML PATH('')),1,1,''))+' 
    from deleted 

    PRINT ''AFTER TRIGGER FIRED'' 
' FROM CTE order by name OFFSET 81 ROWS FETCH NEXT 571 ROWS ONLY 

轨道表但你需要创建一个表与实际表的名称前缀LOG_每张桌子前。

例如:如果你有表Employee (Eid int, EName Varchar(250))

你需要有一个表像

Log_Employee (LOG_EID int identity,Log_DTe Datetime, EID int FK, EName Varchar(250))