DDLトリガの応用
12356 ワード
一般に、DMLフリップフロップは、特定の対象の特定のデータの変更をモニタすることができる.しかし、DDLトリガは、DDLトリガを利用してログイン制限をしたり、ログ制御をしたりするなど、サーバの動作を監視することができます.
はい、それから簡単に例を挙げます.
まず、テーブルの作成を監視するトリガ、DDLトリガを作成します.キーは、EVENTDATA()という関数が提供する情報です.
他の場合、EVENTDATA()が呼び出され、一定のNULL値が返されますが、DDLフリップフロップでは、重要な役割を果たしています.基本的にキャプチャする必要があるメッセージは、この関数で取得できます.この関数について、返される構造は、次のように参照できます.
記録するものはほとんどあります.少し処理すれば、操作記録ができます.
次に、このトリガを改造して、新しい変更テーブルになってトリガーし、次の文を実行します.
前に追加したTableよりもAlterTable ActionListというノードが多くなっています.だから、時間によって、表示されるフォーマットが違います.できることも千変万化していますが、ただ、一時的なオブジェクトはDDLトリガをトリガーしません.
PS:1、ログオントリガは結果セットを返すことができない
2、ログイントリガはエラーを実行できません.慎重にしてください.そうしないと、何もできません.(どうやって知ったのか聞かないで)
3、どんな机能にもメリットとデメリットがありますが、最适なものしかありません.最适なものはありません.
4、皆さんのご指導を歓迎します.
はい、それから簡単に例を挙げます.
まず、テーブルの作成を監視するトリガ、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、皆さんのご指導を歓迎します.