DDL触发器的应用

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

好,然后简单粗暴上例子

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

CREATE TRIGGER TR_CreateTable ON ALL SERVER FOR CREATE_TABLE
AS
BEGIN 
    SELECT EVENTDATA();
    
END
GO

在其他情况下,调用 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_TABLE
AS
BEGIN 
    SELECT EVENTDATA();
    SELECT EVENTDATA().value('(EVENT_INSTANCE/EventType)[1]','varchar(50)'),
           EVENTDATA().value('(EVENT_INSTANCE/ObjectName)[1]','varchar(50)');
END
GO

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、欢迎各位指教拍砖
原文地址:https://www.cnblogs.com/Gin-23333/p/5059056.html