zoukankan      html  css  js  c++  java
  • 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、欢迎各位指教拍砖
  • 相关阅读:
    Codeforces 1368F
    Codeforces 1364C
    Hiho1422 Harmonic Matrix Counter (高斯消元)
    Codeforces 19D
    P3164 [CQOI2014]和谐矩阵(高斯消元 + bitset)
    P4254 [JSOI2008]Blue Mary开公司 (李超树)
    P4755 Beautiful Pair (分治 + 主席树)
    P4587 [FJOI2016]神秘数(主席树)
    分布式锁实现,与分布式定时任务
    redis应用场景,缓存的各种问题
  • 原文地址:https://www.cnblogs.com/Gin-23333/p/5059056.html
Copyright © 2011-2022 走看看