监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)

原文:监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)


在有些公司中,由于管理的不规范,或者是便于开发人员直接修改、部署程序,往往任何开发人员,都能登录到生产环境的数据库直接进行操作。

当然啦,一般的select语句可能不会导致什么太大的问题,但如果是delete和update,而由于某些开发人员忘记写where条件,或者条件写错了,导致一下子删除或更新了,导致数据出了问题,最关键的是当发现问题后,没有人承认这个是他干的,那该怎么办呢?

下面就是通过DML触发器,来监控哪些IP的机器,在什么时候进行了update操作:


  1. --要跟踪的表
  2. if OBJECT_ID('wc') is not null
  3. drop table wc
  4. go
  5. create table wc(id int,vv varchar(10))
  6. insert into wc
  7. select 1,'abc' union all
  8. select 2,'abc' union all
  9. select 3,'abc'
  10. go
  11. --存放审核信息的表
  12. if OBJECT_ID('audit_table') is not null
  13. drop table audit_table
  14. go
  15. create table audit_table
  16. (
  17. id int identity(1,1) primary key,
  18. spid int,
  19. operation nvarchar(20),
  20. exec_sql nvarchar(max),
  21. connect_time DATETIME,
  22. net_transport NVARCHAR(40),
  23. protocol_type NVARCHAR(40),
  24. auth_scheme NVARCHAR(40),
  25. client_net_address VARCHAR(48),
  26. client_tcp_port int,
  27. local_net_address VARCHAR(48),
  28. local_tcp_port int,
  29. host_name NVARCHAR(128),
  30. program_name NVARCHAR(128),
  31. host_process_id int,
  32. client_interface_name NVARCHAR(32),
  33. exec_datetime datetime
  34. )
  35. go
  36. --触发器
  37. create trigger dbo.trigger_wc
  38. on wc
  39. after update
  40. as
  41. declare @t table(eventtype nvarchar(14),prama smallint,eventinfo nvarchar(max))
  42. insert into @t(eventtype,prama,eventinfo)
  43. exec('DBCC INPUTBUFFER('+@@spid+')')
  44. insert into audit_table
  45. select @@SPID,
  46. 'UPDATE',
  47. (select eventinfo from @t),
  48. (select connect_time from sys.dm_exec_connections where session_id = @@spid),
  49. (select net_transport from sys.dm_exec_connections where session_id = @@spid),
  50. (select protocol_type from sys.dm_exec_connections where session_id = @@spid),
  51. (select auth_scheme from sys.dm_exec_connections where session_id = @@spid),
  52. (select client_net_address from sys.dm_exec_connections where session_id = @@spid),
  53. (select client_tcp_port from sys.dm_exec_connections where session_id = @@spid),
  54. (select local_net_address from sys.dm_exec_connections where session_id = @@spid),
  55. (select local_tcp_port from sys.dm_exec_connections where session_id = @@spid),
  56. (select [host_name] from sys.dm_exec_sessions where session_id = @@spid),
  57. (select [program_name] from sys.dm_exec_sessions where session_id = @@spid),
  58. (select host_process_id from sys.dm_exec_sessions where session_id = @@spid),
  59. (select client_interface_name from sys.dm_exec_sessions where session_id = @@spid),
  60. GETDATE()
  61. go
  62. --更新数据
  63. update wc
  64. set vv = 'aaa'
  65. --查看记录
  66. select *
  67. from audit_table

下面是监控结果:

监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)

监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)
监控SQL:通过SQL Server的DML触发器来监控哪些IP对表的数据进行了修改(2)
发布了416 篇原创文章 · 获赞 135 · 访问量 94万+
上一篇:Listener 监听Session内的对象


下一篇:Java日志框架-logback的介绍及配置使用方法(纯Java工程)(转)