0
我想在我的数据库中的每个表上创建一个触发器,该触发器将删除数据的副本记录到单个“审计”表中,然后我可以参考。SQL Server在删除到单个表时触发
我看了一下,但似乎找不到一种方法,因为列定义不同而将它全部插入到一个表中。
任何帮助,非常感谢。
谢谢
我想在我的数据库中的每个表上创建一个触发器,该触发器将删除数据的副本记录到单个“审计”表中,然后我可以参考。SQL Server在删除到单个表时触发
我看了一下,但似乎找不到一种方法,因为列定义不同而将它全部插入到一个表中。
任何帮助,非常感谢。
谢谢
这是一个示例代码。我在这里做的是在非常更新哪些用户在表上执行我从表中删除和插入的表中获取新的和旧的值哪些SQL维护当我们更新表。对于你的情况下删除我认为你可以从删除。
ALTER TRIGGER [SIR].[TESTTABLE_UPDATE]
ON [DBO].[TESTTABLE]
AFTER UPDATE
AS
BEGIN
IF (@@ROWCOUNT = 0) return SET NOCOUNT ON; DECLARE @USER VARCHAR(1000)
-- this is a function which can gives u current loggined user in case if someone update the data from backend we can get that user name and log it.
SET @USER='' SET @USER= (select dbo.GetCurrentUserName())
--this is a filter for bulk update which systemm does and you dont care about it so return
if(PATINDEX('%workerprocess%',@USER)>0) return
DECLARE @ID INT , @LOGS VARCHAR(MAX) , @FINALLOGS VARCHAR(MAX) DECLARE @ACTION VARCHAR(MAX)
SET @ACTION ='' SET @LOGS='' SET @FINALLOGS =''
SELECT @LOGS = DELETED.CHANGELOG FROM DELETED
-- individual column that a table contain
IF UPDATE([STATECODE])
BEGIN
SET @Action += '| StateCode Changed from '+convert(varchar, (select isnull([STATECODE],'') FROM deleted )) +' to '+ convert(varchar, (select isnull([STATECODE],'') FROM inserted )) +' | '
END
-- individual column that a table contain
IF UPDATE([FACILITYCODE])
BEGIN
SET @Action += '| FacilityCode Changed from '+convert(varchar, (select isnull([FACILITYCODE],'') FROM deleted )) +' to '+ convert(varchar, (select isnull([FACILITYCODE],'') FROM inserted )) +' | '
END
IF UPDATE([INSTALLATIONCODE])
BEGIN
SET @Action += '| InstallationCode Changed from '+convert(varchar, (select isnull([INSTALLATIONCODE],'') FROM deleted )) +' to '+ convert(varchar, (select isnull([INSTALLATIONCODE],'') FROM inserted )) +' | '
END
set @FINALLOGS =' [SIR.INSTALLATIONS Updated On ' + CONVERT(varchar(25), GETDATE()) + @ACTION + ISNULL(@LOGS,'') +' ] '
-- this is my audit table where I am logging everything.
INSERT INTO SIR.UserChangeLog (UpdatedBy,ChangeLog) VALUES(@user, @FINALLOGS)
END
---- End tirgger ---------
创建审核表:
CREATE TABLE [dbo].[MyAudit](
[id] [int] IDENTITY(1,1) NOT NULL,
[TableName] [nvarchar](100) NOT NULL,
[ColumnName] [nvarchar](100) NOT NULL,
[DeletedValue] [sql_variant] NULL,
[ChangeDateTime] [datetime] NOT NULL,
)
GO
ALTER TABLE [dbo].[MyAudit] ADD CONSTRAINT [DF_MyAudit_ChangeDateTime] DEFAULT (getdate()) FOR [ChangeDateTime]
添加触发器你要登录删除每个表:
CREATE TRIGGER [MyTrigger]
ON [MyTable]
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
Insert into [MyAudit] ([Tablename], [ColumnName], [DeletedValue])
Select 'MyTable', 'Column1', deleted.Column1 from deleted
Insert into [MyAudit] ([Tablename], [ColumnName], [DeletedValue])
Select 'MyTable', 'Column2', deleted.Column2 from deleted
--Do all columns until column x
Insert into [MyAudit] ([Tablename], [ColumnName], [DeletedValue])
Select 'MyTable', 'ColumnX', deleted.ColumnX from deleted
END
[变更数据捕获(https://msdn.microsoft .com/en-us/library/cc645937(v = sql.110).aspx)可能是更好的方法。 –
不幸的是,我无法这样做,因为我们只使用标准版本的SQL Server,并且仅在企业版,开发人员版和企业评估版中提供。 – DaRoGa
@DaRoGa可以创建一个字符串然后保存到数据库的一种方法。该字符串的格式可以像{columnname:}:Oldvalue | NewValue {chnaged by:} currentuser name。我在我的一个应用程序中实现了它,但它需要在每个表格触发器上单独完成。如果你喜欢,我可以分享一个演示触发器,如果这种方法与你相符,我的触发器是更新触发器,所以我可以获得新旧价值。 –