如何在将来跟踪删除



我的数据武器中有一个表;用户应该只从该表中读取……我检查了表,表格下降,意思是某人,SP或工作,删除了记录,我认为这不是第一次。

我的问题:跟踪这一点的侵入性和简单方法是什么:我不想防止这种情况;我想获取该人的名字或SP/Job名称,以及它发生的确切时间。

我正在使用:Microsoft SQL Server 2012(SP1)-11.0.3000.0(x64):Windows NT 6.2上的商业智能版(64位)(构建9200:)(HyperVisor)

>

我有"简单"的恢复模型,我认为过去跟踪它确实具有挑战性,所以我很高兴将来检索这些信息。

您可以在表上使用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

我使用类似的触发器来记录数据更改以插入,更新和删除SQL数据库表上的DML,如我在Referred Tutorial中所述

中所述。

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

注意:您可以排除您不想要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_的表之前。

ex:如果您有表Employee (Eid int, EName Varchar(250))

您需要有一个

之类的桌子

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

最新更新