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

最后在写个代码对比工具,SQL存储过程编写就可以实现SVN的功能

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

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

  1. 使用PreparedStatement向数据表中插入、修改、删除、获取Blob类型的数据

    使用PreparedStatement向数据表中插入.修改.删除.获取Blob类型的数据 2014-09-07 20:17 Blob介绍 BLOB类型的字段用于存储二进制数据 MySQL中,BLOB是 ...

  2. sql的存储过程实例--循环动态创建表

    创建一个存储过程,动态添加100张track表表名track_0 ~~ track_99注:sql的拼接只能用 CONCAT()函数 -- 创建一个存储过程 CREATE PROCEDURE crea ...

  3. Oracle数据库—— 存储过程与函数的创建

    一.涉及内容 1.掌握存储过程与函数的概念. 2.能够熟练创建和调用存储过程与函数. 二.具体操作 1.创建存储过程,根据职工编号删除scott.emp表中的相关记录. (1)以scott 用户连接数 ...

  4. Sql Server存储过程和函数浅谈

    今天给大家总结一下sql server中的存储过程和函数.本人是小白,里面内容比较初级,大神不喜勿喷 自行飘过就是.. 首先给大家简单列出sql server中的流控制语句,后面会用到的^_^ sql ...

  5. 面试问题 - SQL 中存储过程与函数的区别

    SQL 中的存储过程与函数没有本质上的区别 函数 -> 只能返回一个变量. 函数可以嵌入到sql中使用, 可以在select 中调用, 而存储过程不行.  但函数也有着更多的限制,比如不能使用临 ...

  6. SQL中存储过程和函数的区别

    转:https://www.cnblogs.com/jacketlin/p/7874009.html 本质上没区别.只是函数有如:只能返回一个变量的限制.而存储过程可以返回多个. 而函数是可以嵌入在s ...

  7. sql server 笔记(数据类型/新建、修改、删除数据表/)

    1.数据类型: Character 字符串 / Unicode 字符串 / Binary 类型 / Number 类型  /  Date 类型  / 其他数据类型 详解:http://www.w3sc ...

  8. db2 中 SQL判断物理表是否存在、修改表名

    1.db2 中 SQL判断物理表是否存在 SELECT * FROM SYSIBM.SYSTABLES WHERE TID <> 0 AND Name = 'TABLE_NAME' AND ...

  9. MySQL使用SQL操作数据表的增加、修改和删除

    表的修改和删除 修改 -- 修改表名称 -- ALTER TABLE 旧表名 RENAME AS 新表名 ALTER TABLE test RENAME AS test1 -- 增加表字段 -- AL ...

随机推荐

  1. (转)Django学习之 第四章:Django模板系统

    前面的章节我们看到如何在视图中返回HTML,但是HTML是硬编码在Python代码中的 这会导致几个问题: 1.显然,任何页面的改动会牵扯到Python代码的改动 网站的设计改动会比Python代码改 ...

  2. (转载)Android自定义标签列表控件LabelsView解析

    Android自定义标签列表控件LabelsView解析 作者 donkingliang 关注 2017.03.15 20:59* 字数 759 阅读 406评论 0喜欢 3 无论是在移动端的App, ...

  3. android夜间模式切换

    1.记录个最简单的夜间模式的实现 2.styles.xml <style name="DayTheme" parent="AppTheme"> &l ...

  4. HDU 1213 How Many Tables【并查集】

    解题思路:和畅通工程类似,问最后还剩下几个不连通的区域. How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  5. JOptionPane提示框的一些常用用法

    1.1 showMessageDialog 显示一个带有OK 按钮的模态对话框. 下面是几个使用showMessageDialog 的例子: JOptionPane.showMessageDialog ...

  6. Comparison of programming languages

    The following table compares general and technical information for a selection of commonly used prog ...

  7. 百度api使用说明

    .初始化地图,并设置地图中心点 复制代码 https://www.cnblogs.com/zqzjs/p/5293698.html var map = new BMap.Map("allma ...

  8. JQ UI dialog

    初始化参数 对于 dialog 来说,首先需要进行初始化,在调用 dialog 函数的时候,如果没有传递参数,或者传递了一个对象,那么就表示在初始化一个对话框. 没有参数,表示按照默认的设置初始化对话 ...

  9. v-model指令后面跟的参数(number、lazy、debounce)

    1. number 想将用户的输入自动转换为Number类型(如果原值的转换结果为NaN, 则返回原值) 2. lazy 在默认情况下, v-model在input事件中同步输入框的值和数据, 我们可 ...

  10. UVALive-7197 Axles 动态规划 多个背包问题

    题目链接:https://cn.vjudge.net/problem/UVALive-7197 题意 需要生产n种(2<=n<=14)零件,每种零件可以用两种材料制作,对这两种材料的消耗相 ...