Sqlserver:利用Sqlserver2005的数据库触发器开发的数据库审核追踪系统,可以跟踪对象的修改信息及修改源代码
2009-06-14 21:39
465 查看
建立跟踪的相关表
--触发事件记录表
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
--触发事件记录表
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
相关文章推荐
- 基于面向对象思想利用Web Service开发三层体系结构的某市规划信息管理系统
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。
- sqlserver 2005 开发斑安装,出现 "SQL Server 安装程序无法获取 ASPNET 帐户的系统帐户信息"的解决方法
- SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能
- 【原创】SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能
- 在多模块开发的时候,利用项目继承可以将结构信息、部署信息,将共同的依赖放在一个父类中。
- 关于SqlServer修改数据库常用信息的方法
- Scripts:比较数据库对象的信息(在开发环境中可能需要经常遇到,需要小心使用哦)dba_compare_schemas.sql
- 利用集合完成象数据库那样存储数据,并且可以简单查询,利用map存储学生信息
- VC开发数据库系统管理员密码修改模块
- SNF快速开发平台MVC-审核流,审核完成后会给下一个审核人发邮件,下一个审核人可以不登录系统,在邮件里进行审核处理
- c语言使用链表编写一个可以实现班级学生管理系统,增加,删除,修改学生信息
- 把RecordSet的LockType属性设置为4,可以保证“修改操作”只作用于RecordSet对象,而不会影响到数据库
- 利用SQLServer备份文件创建数据库(针对C/S系统)
- sqlserver2005 利用触发器 使得在对数据库操作时,自动触发事件
- 批量修改Sqlserver中数据库对象的所属架构
- [置顶]信息发布系统 Jquery+MVC架构开发(2) 在EA下进行数据库设计
- vc++学生选课系统开发 sql语句操作数据库 修改课程名模块
- Sqlserver2005 CLR数据库对象开发指南教程
- 学生信息综合管理系统开发记录(数据库课程设计)