更多参考: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. circRNA 中的ALU 重复元件

    circRNA 最初研究的很少,只有很小一部分基因有检测到circRNA, 当时都认为是剪切错误形成的,对于其功能也没人去研究:学者对人类的成纤维细胞进行转录组测序,构建去核糖体文库, 同时采用了RN ...

  2. Angular4学习笔记(一)-环境搭建

    下载nodejs 下载地址 在命令行输入:npm -v 如果出现如下画面即安装成功 安装Angular的cli命令行工具 命令:sudo npm install -g @angular/cli 输入n ...

  3. [PHP] 06 - Security: Error, Exception and Filter

    前言 Ref: PHP 发送电子邮件 Ref: PHP Secure E-mails PHP发邮件部分在此系列中略. 这里展开”安全“相关的部分. 有啥区别?  Ref: PHP异常与错误处理机制 P ...

  4. SQLServer最耗资源时间的SQL语句

    作者kolachen http://blog.sina.com.cn/s/blog_63f3e0060102vcm0.html 先拷过来了,等有空再研究一下 执行最慢的SQL语句 SELECT (to ...

  5. 7.15python进程锁

    #!/usr/bin/env python #!--*--coding:utf-8 --*-- #!@Time :2018/7/14 17:33 #!@Author TrueNewBee #锁 # 火 ...

  6. Javascrit 总结

    1. 数组三种表达方法 第一种 var arr = new Array(1,2,3); document.writeln(arr+"<br/>"); 第二种 var a ...

  7. hbase与hive集成:hive读取hbase中数据

    1.创建hbase jar包到hive lib目录软连接 hive需要jar包: hive-hbase-handler-0.13.1-cdh5.3.6.jar zookeeper-3.4.5-cdh5 ...

  8. Angular4 —— NgModule

    http://www.cnblogs.com/dojo-lzz/p/5878073.html

  9. 一次Flannel和Docker网络不通定位问题

    一次Flannel和Docker网络不通定位问题    查看路由表的配置 路由表情况 [root@k8s-master ~]# route -n Kernel IP routing table Des ...

  10. [nginx] load balancing & location

    一 将NGINX配置成7层load balancer,该怎么做? 参见: http://nginx.org/en/docs/http/load_balancing.html https://docs. ...