• SQL 自动记录存储过程,表,函数的创建修改和删除 -相当于SVN一样


         在项目开发过程中,项目管理者通常都很希望对项目的开发进展有一个日志的记录。代码的记录和管理可以通过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的功能

    对比功能参考:https://www.cnblogs.com/weifeng123/p/9900023.html

  • 相关阅读:
    高性能反射初体验2
    高性能反射初体验1
    HTML解析原理
    QQ邮箱漂流瓶的"变化"~~
    javascript跟随滚动条滚动,onscroll事件的学习
    认识一下window.location.hash
    IE中替换a标签href属性的一个bug
    用css Sprites的时候IE6的一个小bug
    css中如何引入“非常” 字体
    [重温经典]ie6 不支持position:fix的解决方案
  • 原文地址:https://www.cnblogs.com/weifeng123/p/9894659.html
Copyright © 2020-2023  润新知