Sqlserver:利用Sqlserver2005的数据库触发器开发的数据库审核追踪系统,可以跟踪对象的修改信息及修改源代码
建立跟踪的相关表
--触发事件记录表
CREATE TABLE [VER_EVENT](
[SN] bigint identity(1,1),
[LoginName] SYSNAME NULL,
[PostTime] [datetime] NULL,
[DatabaseName] SYSNAME NULL,
[EventType] SYSNAME NULL,
[ObjectType] SYSNAME NULL,
[ObjectName] SYSNAME NULL,
[CommandText] [nvarchar](max) NULL
) ON [PRIMARY]
GO
--版本控制表
CREATE TABLE [VER_CONTROL](
[SN] [bigint] IDENTITY(1,1) NOT NULL,
[DatabaseName] [sysname] NULL,
[ObjectType] [sysname] NULL,
[ObjectName] [sysname] NULL,
[Version] [int] NULL,
[SN_EVENT] [bigint] NULL
) ON [PRIMARY]
建立触发器
/************************************************************************
-- 功 能:数据库的对象版本跟踪系统
-- 日 期:2008-10-09
-- 作 者:
-- 参 数:
-- 返 回 值:
-- 说 明:有两个相关的表
************************************************************************/
--CREATE TRIGGER VERSION_CONTROL
ALTER TRIGGER [VERSION_CONTROL]
ON DATABASE
FOR
CREATE_TABLE,ALTER_TABLE,DROP_TABLE,
CREATE_PROCEDURE,ALTER_PROCEDURE,DROP_PROCEDURE,
CREATE_FUNCTION,ALTER_FUNCTION,DROP_FUNCTION
AS
BEGIN
SET NOCOUNT ON
DECLARE @ObjectName SYSNAME
DECLARE @EventType SYSNAME
DECLARE @DatabaseName SYSNAME
DECLARE @ObjectType SYSNAME
DECLARE @CommandText NVARCHAR(MAX)
DECLARE @Ver INT
DECLARE @SN INT
SET @Ver = NULL
SET @DatabaseName = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','sysname')
SET @ObjectType = EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]','sysname')
SET @ObjectName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','sysname')
SET @EventType = EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]','sysname')
SET @CommandText = EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
INSERT INTO VER_EVENT([LoginName],[PostTime],[DatabaseName],[EventType],[ObjectType],[ObjectName],[CommandText])
SELECT
EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]','sysname') as LoginName,
EVENTDATA().value('(/EVENT_INSTANCE/PostTime)[1]','datetime') as PostTime,
@DatabaseName,@EventType,@ObjectType,@ObjectName,@CommandText
SET @SN = @@IDENTITY
SELECT @Ver = [Version]
FROM VER_CONTROL
WHERE [DatabaseName] = @DatabaseName AND [ObjectType] = @ObjectType AND [ObjectName] = @ObjectName
IF @EventType LIKE 'CREATE%' AND @ObjectName NOT LIKE 'T%'
BEGIN
IF @Ver IS NULL
INSERT INTO [VER_CONTROL]([DatabaseName],[ObjectType],[ObjectName],[Version],[SN_EVENT])
SELECT @DatabaseName,@ObjectType,@ObjectName,10001,0
ELSE
UPDATE VER_CONTROL
SET [Version] = @Ver + 10000,[SN_EVENT] = @SN
WHERE [DatabaseName] = @DatabaseName AND [ObjectType] = @ObjectType AND [ObjectName] = @ObjectName
END
IF @EventType LIKE 'ALTER%' AND @ObjectName NOT LIKE 'T%'
BEGIN
IF @Ver IS NULL
INSERT INTO [VER_CONTROL]([DatabaseName],[ObjectType],[ObjectName],[Version],[SN_EVENT])
SELECT @DatabaseName,@ObjectType,@ObjectName,10001,0
ELSE
UPDATE VER_CONTROL
SET [Version] = @Ver + 1,[SN_EVENT] = @SN
WHERE [DatabaseName] = @DatabaseName AND [ObjectType] = @ObjectType AND [ObjectName] = @ObjectName
END
IF @EventType LIKE 'DROP%' AND @ObjectName NOT LIKE 'T%'
BEGIN
IF @Ver IS NULL
INSERT INTO [VER_CONTROL]([DatabaseName],[ObjectType],[ObjectName],[Version],[SN_EVENT])
SELECT @DatabaseName,@ObjectType,@ObjectName,-10001,0
ELSE
UPDATE VER_CONTROL
SET [Version] = @Ver * (-1),[SN_EVENT] = @SN
WHERE [DatabaseName] = @DatabaseName AND [ObjectType] = @ObjectType AND [ObjectName] = @ObjectName
RETURN
END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)