更多参考:https://www.cnblogs.com/gered/p/10812399.html

使用触发器记录DML,使用触发器记录表的DML

数据库级别DML操作监控审计、表触发器/对象触发器

  1. --核心参考
  2. --SqlServer触发器 ,目的是记录操作内容
  3. begin
  4. declare @di table(et varchar(200), pt varchar(200), ei varchar(max))
  5. insert into @di exec('dbcc inputbuffer(@@spid)')
  6. declare @op varchar(10) select @op=case when exists(select 1 from inserted) and exists(select 1 from deleted)
  7. then 'Update'
  8. when exists(select 1 from inserted) and not exists(select 1 from deleted)
  9. then 'Insert'
  10. when not exists(select 1 from inserted) and exists(select 1 from deleted)
  11. then 'Delete'
  12. end
  13. if @op in('Update','Insert')
  14. begin
  15. insert into synchronization.dbo.synchro_log (operate,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
  16. select @op,@@spid,
  17. (select login_name from sys.dm_exec_sessions where session_id=@@spid),
  18. (select program_name from sys.dm_exec_sessions where session_id=@@spid),
  19. (select hostname from sys.sysprocesses where spid=@@spid),
  20. (select client_net_address from sys.dm_exec_connections where session_id=@@spid),
  21. (select top 1 isnull(ei,'') from @di), getdate()
  22. from inserted n
  23. end
  24. else
  25. begin
  26. insert into synchronization.dbo.synchro_log (operate,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
  27. select @op,@@spid,
  28. (select login_name from sys.dm_exec_sessions where session_id=@@spid),
  29. (select program_name from sys.dm_exec_sessions where session_id=@@spid),
  30. (select hostname from sys.sysprocesses where spid=@@spid),
  31. (select client_net_address from sys.dm_exec_connections where session_id=@@spid),
  32. (select top 1 isnull(ei,'') from @di),
  33. getdate()
  34. from deleted o
  35. end
  36. end

  1.  
  1. --创建记录表
  2.  
  3. CREATE TABLE T_SHALL_LOG (
  4. ID INT NOT NULL IDENTITY(1, 1)
  5. , EVTIME DATETIME NOT NULL DEFAULT(GETDATE())
  6. , --访问时间
  7. SQL VARCHAR(300)
  8. , --执行的SQL语句
  9. USERID VARCHAR(128) NOT NULL DEFAULT(SUSER_SNAME())
  10. , --连接的时候使用的哪个SQL登陆用户
  11. HOSTNAME VARCHAR(128) NOT NULL DEFAULT(HOST_NAME())
  12. , --客户端的机器吿
  13. LOGINID VARCHAR(128)
  14. , --客户端的登陆用户(OS的用户)
  15. APPNAME VARCHAR(128) NOT NULL DEFAULT(APP_NAME())
  16. , --是从查询分析器,还是应用程序来执行的
  17. OPTYPE INT
  18. , --执行的是INSERT,UPDATE,还是DELETE操作
  19. ROWCNT INT --影响了多少行数据
  20. )
  21. GO
  22.  
  23. --创建测试表
  24.  
  25. CREATE TABLE T_SHALL (
  26. A INT
  27. , B VARCHAR(10)
  28. )
  29. GO
  30.  
  31. ---创建触发器
  32.  
  33. CREATE TRIGGER TR_T_SHALL ON T_SHALL --需要监控的表名
  34. FOR INSERT
  35. , DELETE
  36. , UPDATE
  37. AS
  38. --ROWCNT
  39. DECLARE @ROWS INT
  40.  
  41. SET @ROWS = @@ROWCOUNT
  42. SET NOCOUNT ON
  43.  
  44. --SQL
  45. CREATE TABLE #T (
  46. EVENTTYPE VARCHAR(20)
  47. , PARAMETERS INT
  48. , EVENTINFO VARCHAR(300)
  49. ) ----用临时表保存exec('DBCC INPUTBUFFER...')的返回倿
  50.  
  51. DECLARE @SPID VARCHAR(20)
  52.  
  53. SET @SPID = CAST(@@SPID AS VARCHAR)
  54.  
  55. INSERT #T
  56. EXEC ('DBCC INPUTBUFFER (' + @SPID + ')')
  57.  
  58. --OPTYPE
  59. DECLARE @OPTYPE INT
  60.  
  61. SET @OPTYPE = 2 --UPDATE
  62.  
  63. IF NOT EXISTS (
  64. SELECT 1
  65. FROM INSERTED
  66. )
  67. SET @OPTYPE = 3 --DELETE
  68.  
  69. IF NOT EXISTS (
  70. SELECT 1
  71. FROM DELETED
  72. )
  73. SET @OPTYPE = 1 --INSERT
  74.  
  75. --进程信息
  76. DECLARE @USERID VARCHAR(128)
  77. , --连接的时候使用的哪个SQL登陆用户
  78. @HOSTNAME VARCHAR(128)
  79. , --客户端的机器吿
  80. @LOGINID VARCHAR(128)
  81. , --客户端的登陆用户(OS的用户)
  82. @APPNAME VARCHAR(128) --是从查询分析器,还是应用程序来执行的
  83.  
  84. SELECT @USERID = LOGINAME
  85. , --连接的时候使用的哪个SQL登陆用户
  86. @HOSTNAME = HOSTNAME
  87. , --客户端的机器吿
  88. @LOGINID = NT_USERNAME
  89. , --客户端的登陆用户(OS的用户)
  90. @APPNAME = PROGRAM_NAME --是从查询分析器,还是应用程序来执行的
  91. FROM MASTER..SYSPROCESSES
  92. WHERE SPID = @@SPID
  93.  
  94. --INSERT
  95. INSERT T_SHALL_LOG (
  96. SQL
  97. , USERID
  98. , HOSTNAME
  99. , LOGINID
  100. , APPNAME
  101. , OPTYPE
  102. , ROWCNT
  103. )
  104. SELECT EVENTINFO
  105. , @USERID
  106. , @HOSTNAME
  107. , @LOGINID
  108. , @APPNAME
  109. , @OPTYPE
  110. , @ROWS
  111. FROM #T
  112. GO
  113.  
  114. ----DML操作测试
  115. SELECT *
  116. FROM t_shall_log;
  117. SELECT *
  118. FROM t_shall;
  119.  
  120. INSERT t_shall
  121. VALUES (11, 'zhong' );
  122. INSERT t_shall
  123. VALUES (12 , 'shall')
  124.  
  125. GO
  126. INSERT t_shall
  127. SELECT A + 2
  128. , B + ''
  129. FROM t_shall
  130.  
  131. GO
  132.  
  133. BEGIN TRANSACTION
  134. UPDATE t_shall
  135. SET A = 100 , B = ''
  136. WHERE A = 11
  137. COMMIT TRANSACTION
  138.  
  139. GO
  140.  
  141. DELETE t_shall WHERE A = 100
  142.  
  143. GO
  144.  
  145. SELECT * FROM t_shall_log;
  146.  
  147. SELECT * FROM t_shall;
  148.  
  149. INSERT dbo.T_SHALL
  150. VALUES (1000, 'sa')
  151.  
  152. GO
  153. DELETE dbo.T_SHALL
  154.  
  155. GO
  156.  
  157. --核验
  158. select * from dbo.T_SHALL
  159.  
  160. go
  161.  
  162. select * from dbo.T_SHALL_LOG
  163.  
  164. go
  165.  
  1.  

数据库级别DML操作监控审计、表触发器/对象触发器的更多相关文章

  1. 数据库级别DDL操作监控审计、数据库触发器/服务器触发器

    关键词:数据库触发器/服务器触发器  ,数据库级别DDL操作监控审计,禁止修改登录名密码 [1]数据库级别DDL操作监控审计 转自2012示例库,只能数据库级别,不能实例级别 use database ...

  2. 怎样加快master数据库的写操作?分表原则!将表水平划分!或者添加写数据库的集群

    1.怎样加快master数据库的写操作?分表原则!将表水平划分!减少表的锁定时间!!! 或者或者添加写数据库的集群!!!或者添加写数据库的集群!!! 2.既然分表了,就一定要注意分表的规则!要在代码层 ...

  3. Oracle 11G CRUD操作监控单个表

    前言:    线上oracle数据库有张表的数据有些乱,依据应用db的log和应用的log也没有检查出来谁改动了.所以决定把这张单表做个具体的insert.update.delete监控.一:使用数据 ...

  4. SQL监控:mysql及mssql数据库SQL执行过程监控审计

    转载 Seay_法师 最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好 ...

  5. Oracle触发器实现监控某表的CRUD操作

    前提:请用sys用户dba权限登录 1.创建一个表来存储操作日志 create table trig_sql( LT DATE not null primary key, SID NUMBER, SE ...

  6. SQLServer 创建服务器和数据库级别审计

    概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 一.常用的审核对象 1.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit L ...

  7. SQL Server 创建服务器和数据库级别审计

    一.概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 二.常用的审核对象 2.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit ...

  8. SQL Server如何用触发器捕获DML操作的会话信息

    需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数 ...

  9. ORACLE中如何查找定位表最后DML操作的时间小结

    在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析.总结一下. 1:使用ORA_ROWSCN伪列获取表最后的DML时间 ORA_ ...

随机推荐

  1. ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台

    日志分析平台,架构图如下: 架构解读 : (整个架构从左到右,总共分为5层) 第一层.数据采集层 最左边的是业务服务器集群,上面安装了filebeat做日志采集,同时把采集的日志分别发送给两个logs ...

  2. Spark学习笔记——Spark Streaming

    许多应用需要即时处理收到的数据,例如用来实时追踪页面访问统计的应用.训练机器学习模型的应用, 还有自动检测异常的应用.Spark Streaming 是 Spark 为这些应用而设计的模型.它允许用户 ...

  3. [转]搞个这样的 APP 要多久

    我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要进来干一场,尽管王总从事的行当也算跟IT沾边,但毕竟太长时间不接触技术,有些东西不 ...

  4. PHP_CodeSniffer HG 服务端部署篇

    环境:CentOs 6.7 语言:PHP5.4 PHP_CodeSniffer: https://github.com/phpdragon/PHP_CodeSniffer 本地代码检测请查看该文章:h ...

  5. 简单xmlrpc服务器

    import calendar, SimpleXMLRPCServer class Calendar: def getMonth(self, year, month): return calendar ...

  6. day_10 py

    整理代码!!2018-7-24 20:53:49 直接复制了东西: 一些的demo 重点看蓝字部分! 就是一些简单的方法 基础的而已! 2018-4-22 15:50:26 继续py 还是py好玩感觉 ...

  7. E - Train Problem I

    As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to ge ...

  8. B - 考试排名

    C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么"AC",要么错误,不管怎样错法,总是给你记上一笔,表明 ...

  9. ERP项目实施记录03

    今天继续测试,3周了,终于弄到采购进货.

  10. robot framework教程-------虫师

    http://www.testclass.net/2017/09/28/happy-holidays/