你的位置:首页 > 数据库

[数据库]DDL触发器的应用


一般来说,DML触发器可以监测得到具体对象的具体数据的变更。然而,DDL触发器则能够对一些服务器的行为作出监控,比如我们可以利用DDL触发器来做登录限制啊,做一些日志控制啊之类的。

好,然后简单粗暴上例子

首先我们做一个监控创建表的触发器,DDL触发器,一个关键点是在于 EVENTDATA() 这个函数提供的信息。

CREATE TRIGGER TR_CreateTable ON ALL SERVER FOR CREATE_TABLEASBEGIN   SELECT EVENTDATA();  ENDGO

在其他情况下,调用 EVENTDATA(),它返回的恒定是一个NULL值,然而,当在DDL触发器里面,它在作用就至关重大了,基本上需要捕获的消息,都可以通过这个函数获取,这个对于这个函数,返回的结构可以参考如下

 

<EVENT_INSTANCE> <EventType>CREATE_TABLE</EventType> <PostTime>2015-12-19T11:03:45.223</PostTime> <SPID>54</SPID> <ServerName>IN</ServerName> <LoginName>sa</LoginName> <UserName>dbo</UserName> <DatabaseName>Test</DatabaseName> <SchemaName>dbo</SchemaName> <ObjectName>T1</ObjectName> <ObjectType>TABLE</ObjectType> <TSQLCommand>  <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />  <CommandText>CREATE TABLE T1(ID INT)</CommandText> </TSQLCommand></EVENT_INSTANCE>

要记录的东西基本都有了。稍加处理,即可做成操作记录了。

 然后我们改造一下这个触发器,变成新增修改表都要触发,然后执行如下语句

ALTER TRIGGER TR_CreateTable ON ALL SERVER FOR CREATE_TABLE,ALTER_TABLEASBEGIN   SELECT EVENTDATA();  SELECT EVENTDATA().value('(EVENT_INSTANCE/EventType)[1]','varchar(50)'),      EVENTDATA().value('(EVENT_INSTANCE/ObjectName)[1]','varchar(50)');ENDGO

ALTER TABLE T1 ADD col1 VARCHAR(50)

 

 

<EVENT_INSTANCE> <EventType>ALTER_TABLE</EventType> <PostTime>2015-12-19T11:19:21.947</PostTime> <SPID>54</SPID> <ServerName>IN</ServerName> <LoginName>sa</LoginName> <UserName>dbo</UserName> <DatabaseName>Test</DatabaseName> <SchemaName>dbo</SchemaName> <ObjectName>T1</ObjectName> <ObjectType>TABLE</ObjectType> <AlterTableActionList>  <Create>   <Columns>    <Name>col1</Name>   </Columns>  </Create> </AlterTableActionList> <TSQLCommand>  <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />  <CommandText>ALTER TABLE T1 ADD col1 VARCHAR(50)</CommandText> </TSQLCommand></EVENT_INSTANCE>

 

看,比前面新增Table多出了  AlterTableActionList 这个节点。所以说,不同的时间,显示出来的格式都不一样。可以做的东西也千变万化,只是有一点,临时对象不会触发DDL触发器。

 
PS:1、登录触发器不能有返回结果集
      2、登录触发器不能运行出错,慎重,不然就什么都干不了。(不要问我怎么知道的)
  3、任何功能都都有优点和缺点,只有最适合的,没有最优的~么么么哒
  4、欢迎各位指教拍砖