标签:
一般来说,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触发器。
标签:
原文地址:http://www.cnblogs.com/Gin-23333/p/5059056.html