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触发器。
DDL触发器的应用的更多相关文章
- SQL Server DDL触发器运用
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) DDL运用场景(DDL Scene) ...
- SQLServer之创建Transact-SQL DDL触发器
DDL触发器原理 DDL 触发器用于响应各种数据定义语言 (DDL) 事件. 这些事件主要与以关键字 CREATE.ALTER.DROP.GRANT.DENY.REVOKE 或 UPDATE STAT ...
- 使用DDL触发器同步多个数据库结构
使用DDL触发器同步多个数据库结构 背景:当开发组比较大时,势必会分布到不同的地理位置,若无法在同一个快速网络中工作,就会造成多个开发库并存的局面,这样就需要多个开发库结构的同步,甚至是开发测试数据的 ...
- DDL触发器(用来控制用户的DDL行为)
DDL触发器 禁止scott用户的所有DDL操作 create or replace trigger scott_forbid_trigger before ddl on schema begin r ...
- 记录数据库操作记录的DDL触发器
我们在项目中经常会对数据做一些操作,比如增加一个字段,修改一个存储过程,删除表等等操作,很有必要记录这些操作,以便以后出了问题,方便找到元凶.接下来介绍一个DDL触发器在实际环境中的使用,这个DDL触 ...
- SQL Server DDL触发器
DDL 触发器作用: DDL 触发器主要用于防止对数据库架构.视图.表.存储过程等进行的某些修改. DDL 触发器事件: DDL 触发器在创建用来监视并响应该数据库或服务器实例中的活动的事件通知时,可 ...
- 监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1)
原文:监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1) 如果你要同步不同数据库之间的数据,首先会想到的是数据库复制技术,但如果让你同步数据库的结构,你会想到什么呢? 下面 ...
- 【监控笔记】【3.1】DML(CDC)、DDL(DDL触发器)跟踪数据更改,数据库审计
关键词:数据库审计.DDL审计.DML审计 [监控笔记][3.1]DML(CDC).DDL(DDL触发器)跟踪数据更改 [1]DML(CDC) 2008及以上 https://www.cnblogs. ...
- oracle触发器——ddl触发器
什么是ddl(data definition language),说白了就是我们经常用的create.alter和drop这些数据定义语句. n 创建ddl触发器 请编写一个触发器,可以记录某个用户 ...
随机推荐
- VirtualBox网络设置的问题
在VirtualBox里新建了一个虚拟Linux系统,默认的连接方式是网络地址转换(NAT).发现主机不能访问虚拟机的samba服务器,ping了一下,虚拟机可以ping主机,但是主机不能ping虚拟 ...
- 修正 ListView 搜寻问题
问题:如果 SearchEdit 里已输入过搜寻字,再新建 ListView 项目后,会无法显示. 适用:Delphi XE5 源码下载:[原创]修正ListView搜寻问题.zip procedur ...
- Spring注解@Value的用法
有时候我们在配置文件中使用配置的信息不仅需要在xml文件中使用,还可能在类中使用,这个时候,我们可使用@Value注解了: @Value("${rest.service.url}" ...
- 简单的mysql查询
mysql是基于客户机-服务器的数据库.客户机-服务器应用分为两个不同的部分.服务器部分是负责所有数据访问和处理的一个软件. 连接mysql 要连接mysql需要知道如下 主机名: 本地为localh ...
- ViewHolder被设计成静态内部类的作用
当你的内部类不需要依赖于外界的属性或方法等,而又想提供给外界使用,可以采取静态内部类的方式来写 其中static的作用是可以提供给外界调用,比如说类名.内部类这种方式 而ViewHolder的实际是为 ...
- node.js如何处理请求的路由
var http = require( 'http' ) var handlePaths = [] /** * 初始化路由配置数组 */ function initRotute() { handleP ...
- Scroll Depth – 衡量页面滚动的 Google 分析插件
Scroll Depth 是一个小型的 Google Analytics(谷歌分析)插件,可以让你衡量用户在页面上滚动了多远.它可以监控 25%.50%.75% 和 100% 四个滚动点,并发送谷歌分 ...
- Node.js Web 开发框架大全《路由篇》
这篇文章与大家分享优秀的 Node.js 路由(Routers)模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...
- window7安装git详解
1.Git详细介绍 一.Git的诞生 Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢? 事实是 ...
- Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作
前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行. 比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void load ...