DDLトリガの応用

12356 ワード

一般に、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よりもAlterTable ActionListというノードが多くなっています.だから、時間によって、表示されるフォーマットが違います.できることも千変万化していますが、ただ、一時的なオブジェクトはDDLトリガをトリガーしません.
 
PS:1、ログオントリガは結果セットを返すことができない
2、ログイントリガはエラーを実行できません.慎重にしてください.そうしないと、何もできません.(どうやって知ったのか聞かないで)
3、どんな机能にもメリットとデメリットがありますが、最适なものしかありません.最适なものはありません.
4、皆さんのご指導を歓迎します.