一般来说,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、欢迎各位指教拍砖

DDL触发器的应用的更多相关文章

  1. SQL Server DDL触发器运用

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) DDL运用场景(DDL Scene) ...

  2. SQLServer之创建Transact-SQL DDL触发器

    DDL触发器原理 DDL 触发器用于响应各种数据定义语言 (DDL) 事件. 这些事件主要与以关键字 CREATE.ALTER.DROP.GRANT.DENY.REVOKE 或 UPDATE STAT ...

  3. 使用DDL触发器同步多个数据库结构

    使用DDL触发器同步多个数据库结构 背景:当开发组比较大时,势必会分布到不同的地理位置,若无法在同一个快速网络中工作,就会造成多个开发库并存的局面,这样就需要多个开发库结构的同步,甚至是开发测试数据的 ...

  4. DDL触发器(用来控制用户的DDL行为)

    DDL触发器 禁止scott用户的所有DDL操作 create or replace trigger scott_forbid_trigger before ddl on schema begin r ...

  5. 记录数据库操作记录的DDL触发器

    我们在项目中经常会对数据做一些操作,比如增加一个字段,修改一个存储过程,删除表等等操作,很有必要记录这些操作,以便以后出了问题,方便找到元凶.接下来介绍一个DDL触发器在实际环境中的使用,这个DDL触 ...

  6. SQL Server DDL触发器

    DDL 触发器作用: DDL 触发器主要用于防止对数据库架构.视图.表.存储过程等进行的某些修改. DDL 触发器事件: DDL 触发器在创建用来监视并响应该数据库或服务器实例中的活动的事件通知时,可 ...

  7. 监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1)

    原文:监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1) 如果你要同步不同数据库之间的数据,首先会想到的是数据库复制技术,但如果让你同步数据库的结构,你会想到什么呢? 下面 ...

  8. 【监控笔记】【3.1】DML(CDC)、DDL(DDL触发器)跟踪数据更改,数据库审计

    关键词:数据库审计.DDL审计.DML审计 [监控笔记][3.1]DML(CDC).DDL(DDL触发器)跟踪数据更改 [1]DML(CDC) 2008及以上 https://www.cnblogs. ...

  9. oracle触发器——ddl触发器

    什么是ddl(data definition language),说白了就是我们经常用的create.alter和drop这些数据定义语句. n  创建ddl触发器 请编写一个触发器,可以记录某个用户 ...

随机推荐

  1. Java--concurrent并发包下阻塞队列介绍

    JDK提供了7中阻塞队列,这里介绍其中3中,剩余的以此类推原理相同. 1.ArrayBlockingQueue package com.seeyon.queue; import java.util.c ...

  2. Elasticsearch1.7到2.3升级实践总结

    概括 简述 升级分为Elasticsearch server升级和Elasticsearch client api升级 为什么要迁移 当前团队内多个业务方公用一套ES集群,容易被影响,重要业务应该独自 ...

  3. InfluxDB学习系列教程,InfluxDB入门必备教程

    nfluxDB是一个当下比较流行的时序数据库,InfluxDB使用 Go 语言编写,无需外部依赖,安装配置非常方便,适合构建大型分布式系统的监控系统. 本文是一系列InfluxDB学习教程的目录,现主 ...

  4. php函数的传值如果需要引用传递注意的细节

    Strict standards: Only variables should be passed by reference 网上查到资料有这么一句话: 在php5.3以上版本会出这个问题,应该也和p ...

  5. [翻译]:SQL死锁-死锁排除

    As we already saw, the reasons why we have blocking issues and deadlocks in the system are pretty mu ...

  6. 使用 WSO2 API Manager 管理 Rest API

    WSO2 API Manager 简介 随着软件工程的增多,越来越多的软件提供各种不同格式.不同定义的 Rest API 作为资源共享,而由于这些 API 资源的异构性,很难对其进行复用.WSO2 A ...

  7. charset的获取方法

      1.解析http请求的返回值: 2.通过解析html的meta标签里面的数据: 3.通过cpdetector(java环境下)来自动验证: ---------------------------- ...

  8. 编译安装mysql(Ubuntu10 64位)

    选用较好的编译器和较好的编译器选项,这样应用可提高性能10-30%,这个对大多数程序都非常重要 Mysql的编译,不同的版本具体的配置方式是有差别的 旧版的配置形式参考 这个形式主要是使用config ...

  9. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q84-Q87)

    Question  84You are designing a Web Part for SharePoint 2010 that must be able to be used on any sit ...

  10. iOS数据缓存及YYCache的实现分析

    1. 什么是cache cache就是缓存的意思. 计算机上的cache就是高速缓存,计算机组成课程里的定义是,存在于主存和CPU之间,主要用于解决CPU处理数据的速度远远大于读取主存数据的速度. 手 ...