在项目开发过程中,项目管理者通常都很希望对项目的开发进展有一个日志的记录。代码的记录和管理可以通过TFS或者VSS等工具去管理。但是数据库却没有记录开发日志这一功能。这在实际开发中很不方便,特别是大量的存储过程改动。
那么针对这一个需求,在数据库中建立一个数据库的触发器,记录存储过程的代码修改!
1 --第一步:建库建表 2 3 if exists(select 1 from master.dbo.sysdatabases where name='AuditDB') 4 5 drop database AuditDB 6 7 go 8 9 10 11 create database AuditDB 12 13 go 14 15 use AuditDB 16 17 go 18 19 if object_id('DDLEvents','u')is not null 20 21 drop table DDLEvents 22 23 go 24 25 create table DDLEvents( 26 27 EventDate datetime default (getdate()) NOT null, --事件时间 28 29 EventType nvarchar(64) null, --事件类型 30 31 EventDDL nvarchar(max) null, --事件内容 32 33 EventXML xml null, --事件xml 34 35 databaseName nvarchar(255) null, --数据库名称 36 37 SchemaName nvarchar(255) null, --架构名 38 39 ObjectName nvarchar(255) null, --用户 40 41 HostName varchar(64) null, --计算机名称 42 43 IPAddress varchar(32) null, --IP地址 44 45 ProgramName nvarchar(255) null, --SQLServer版本 46 47 LoginName nvarchar(255) null --登录名 48 49 ) 50 51 go 52 53 --第二步:在需要监控的库上执行这个脚本,对DDL操作会记录在第一步中的库中 54 55 if exists(select * from sys.triggers where parent_class_desc= 'database' AND name = N'DDLtriggertTrace') 56 57 disable trigger DDLtriggertTrace on database 58 59 if exists(select * from sys.triggers where parent_class_desc= 'database' AND name = N'DDLtriggertTrace') 60 61 drop trigger DDLtriggertTrace on database 62 63 go 64 65 create trigger DDLtriggertTrace on database 66 67 --捕获函数、存储过程、视图、表的创建、修改、删除动作 68 69 for create_function,alter_function, create_procedure, alter_procedure, drop_procedure, create_view, 70 71 alter_view, drop_view, create_table, alter_table, drop_table 72 73 as 74 75 begin 76 77 set nocount on ; 78 79 declare @EventData xml = eventdata() ;--返回有关服务器或数据库事件的信息,以xml格式保存。 80 --rollback; --如果是执行删除动作 直接自动回滚,取消删除 81 declare @ip varchar(32) =( select client_net_address 82 83 from sys.dm_exec_connections 84 85 where session_id = @@SPID 86 87 ) ; 88 89 90 91 insert AuditDB.dbo.DDLEvents 92 93 ( EventType , 94 95 EventDDL, 96 97 EventXML, 98 99 databaseName, 100 101 SchemaName, 102 103 ObjectName, 104 105 HostName, 106 107 IPAddress, 108 109 ProgramName, 110 111 LoginName 112 113 ) 114 115 select @EventData.value('(/EVENT_INSTANCE/EventType)[1]','NVARCHAR(100)') , 116 117 @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]','NVARCHAR(MAX)') , 118 119 @EventData , 120 121 DB_NAME() , 122 123 @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]','NVARCHAR(255)') , 124 125 @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]','NVARCHAR(255)') , 126 127 HOST_NAME() , 128 129 @ip , 130 131 PROGRAM_NAME() , 132 133 SuseR_SNAME() ; 134 135 end 136 137 go
最后在写个代码对比工具,SQL存储过程编写就可以实现SVN的功能