mssql sqlserver eventData函数用法举例简介


摘要:
eventData函数:适用于sqlserver 2005版本及以上版本
eventData函数主要用于捕捉DDl触发器的事件信息,此函数将返回一串xml信息,xml包含以下类型:
EventType:事件类型


例1:捕捉建表语句

     ---创建一个基于建表的数据库触发器--禁止在当前DB下建立新的数据表
     CREATE TRIGGER tr_createTable_stop  
     ON DATABASE 
     FOR CREATE_TABLE 
     AS 
        PRINT '建表中'
        SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') ---返回建表命令行
        RAISERROR ('建表语句被终止', 16, 1)    ----弹出错误信息
         ROLLBACK   ---回滚建表语句
      go 
	   
	  create table A(keyId int)
       go   

	  drop trigger tr_createTable_stop on database
      go 
   


注意事项:
数据库触发器 for create_table 那么只会对create table 语句进行触发,对其它数据库定义语句不会进行触发(例:create function create proc create schema )等等


例2:捕捉数据库所有查询语句

     ---下文展示监控所有的DDL触发器的诶之

---创建数据库触发器日志存放区
CREATE TABLE db_log (writeDate datetime default getdate(),
  userInfo nvarchar(100), --操作用户
  eventType nvarchar(100), ---事件类型
  sqlInfo nvarchar(2000)
  ); ---sql脚本信息
GO
CREATE TRIGGER tr_db_log 
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS   ---所有ddl事件
AS
DECLARE @dataInfo XML
SET @dataInfo = EVENTDATA()
INSERT db_log 
   (userInfo,eventType,sqlInfo) 
   VALUES 
   (CONVERT(nvarchar(88), CURRENT_USER), 
   @dataInfo.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(max)'), 
   @dataInfo.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)') ) ;
GO

------创建测试数据表
create table A(keyId int,name varchar(100))
go 
insert into A(keyId,name)values(1,'a'),
(2,'b'),(3,'c'),(4,'d'),(5,'e')
go
select top 1 * from A 
go
truncate table A
drop table A 

select * from db_log 
go

drop trigger tr_db_log on database
go
truncate table db_log
drop table db_log 
   

mssql_sqlserver_ddl触发器监控语句

mssql_sqlserver_ddl触发器监控语句



注意事项:
数据库触发器 for DDL_DATABASE_LEVEL_EVENTS 那么只会对所有的ddl语句进行监控,并存入日志表中