监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1)

原文: 监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1)

如果你要同步不同数据库之间的数据,首先会想到的是数据库复制技术,但如果让你同步数据库的结构,你会想到什么呢?


下面是一个例子,用来说明通过sql server中的DDL触发器,来记录create table、alter table、drop table等ddl操作。



   
   
  1. --2.1在master数据库中建立服务器级别跟踪表
  2. use master
  3. go
  4. create table server_eventdata
  5. ( eventdata xml,
  6. principal_user nvarchar( 100),
  7. login_user nvarchar( 100)
  8. )
  9. go
  10. /*
  11. select * from sys.trigger_event_types
  12. where type_name like '%table%' or
  13. type_name like '%deny%' or
  14. type_name like '%revoke%'
  15. */
  16. --2.2建立服务器级别触发器
  17. create trigger gyy_server
  18. on all server
  19. for create_table,
  20. alter_table,
  21. drop_table
  22. as
  23. insert into server_eventdata
  24. select EVENTDATA(), USER,SUSER_NAME()
  25. go
  26. --2.3
  27. create database wc
  28. go
  29. use wc
  30. go
  31. create table dbo.wc_table(v int)
  32. insert into dbo.wc_table values( 1)
  33. go
  34. use wc
  35. go
  36. alter table dbo.wc_table
  37. add name varchar( 100)
  38. alter table dbo.wc_table
  39. add tt datetime default getdate()
  40. go
  41. --查看记录的事件
  42. select --EVENTDATA, --里面是所有的信息
  43. eventdata.value( '(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)') as '事件类型',
  44. eventdata.value( '(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(100)') as 'sql语句',
  45. eventdata.value( '(/EVENT_INSTANCE/PostTime)[1]', 'datetime') as '执行时间'
  46. /*
  47. '登录名' + eventdata.value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(100)') +
  48. '用户名' + eventdata.value('(/EVENT_INSTANCE/UserName)[1]','nvarchar(100)') + ',授予者'+
  49. eventdata.value('(/EVENT_INSTANCE/Grantor)[1]','nvarchar(100)') + ' 把类型为:' +
  50. eventdata.value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(100)') + '的对象' +
  51. eventdata.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(100)') + '.' +
  52. eventdata.value('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(100)') + '.' +
  53. eventdata.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(100)') + '的' +
  54. eventdata.value('(/EVENT_INSTANCE/Permissions/Permission)[1]','nvarchar(100)') +'权限授予给' +
  55. eventdata.value('(/EVENT_INSTANCE/Grantees)[1]','nvarchar(100)')
  56. */
  57. from master.dbo.server_eventdata t
  58. /*
  59. 事件类型 sql语句 执行时间 (无列名)
  60. CREATE_TABLE create table dbo.wc_table(v int) 2013-11-07 10:22:31.157 NULL
  61. ALTER_TABLE alter table dbo.wc_table add name varchar(100) 2013-11-07 10:23:59.987 NULL
  62. ALTER_TABLE alter table dbo.wc_table add tt datetime default getdate() 2013-11-07 10:24:00.013 NULL
  63. */


发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

猜你喜欢

转载自www.cnblogs.com/lonelyxmas/p/12019988.html
今日推荐