在項目開發過程當中,項目管理者一般都很但願對項目的開發進展有一個日誌的記錄。代碼的記錄和管理能夠經過TFS或者VSS等工具去管理。可是數據庫卻沒有記錄開發日誌這一功能。這在實際開發中很不方便,特別是大量的存儲過程改動。html
那麼針對這一個需求,在數據庫中創建一個數據庫的觸發器,記錄存儲過程的代碼修改!數據庫
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的功能服務器
對比功能參考:http://www.javashuo.com/article/p-bludehgx-hn.htmlsession