我的Datamart中有一张桌子;用户应该只从该表读取...我检查了表的计数,这意味着,某人,SP或工作,删除了记录,我觉得这不是第一次。
我的问题:什么是侵入性较小,更简单的跟踪方式:我不想阻止这种情况;我想得到这个人的姓名,或SP /工作名称,以及确切的时间。
我正在使用:Microsoft SQL Server 2012(SP1) - 11.0.3000.0(X64):Windows NT 6.2上的商业智能版(64位)(Build 9200:)(管理程序)
我有'简单'的恢复模式,我认为过去跟踪它真的很有挑战性,所以我很高兴将来检索这些信息。
答案 0 :(得分: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))
答案 1 :(得分: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
我在SQL数据库表上使用了类似的trigger to log data changes来插入,更新和删除DML,正如我在推荐的教程中所解释的那样