博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql Server2005 Transact-SQL 新兵器学习总结之-DDL触发器
阅读量:6232 次
发布时间:2019-06-21

本文共 3054 字,大约阅读时间需要 10 分钟。

1.简介:
Sql Server2005新增加了DDL触发器。
与DML触发器不同的是,它们不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而激发。
相反,它们将为了响应各种数据定义语言(DDL)事件而激发。
这些事件主要与以关键字CREATE、ALTER和DROP开头的Transact-SQL语句对应。
执行DDL式操作的系统存储过程也可以激发DDL触发器。
2.作用:
如果要执行以下操作,可以使用DDL触发器: 
(1)要防止对数据库架构进行某些更改。
(2)希望数据库中发生某种情况以响应数据库架构中的更改。 
(3)要记录数据库架构中的更改或事件。
3.DDL 触发器作用域:
(1)数据库范围:数据库范围内的DDL触发器都作为对象存储在创建它们的数据库中。
(2)服务器范围:服务器范围内的DDL触发器作为对象存储在master数据库中。
例如:当数据库中发生CREATE TABLE事件时,都会触发为响应CREATE TABLE事件创建的数据库范围DDL触发器。
每当服务器上发生CREATE Index事件时,都会触发为响应CREATE Index事件创建的服务器范围DDL触发器。
4.与DML触发器比较不同处:
(1)DML触发器在INSERT、UPDATE和DELETE语句上操作。
(2)DDL触发器在CREATE、ALTER、DROP和其他DDL语句上操作。
(3)只有在完成Transact-SQL语句后才运行DDL触发器。DDL 触发器无法作为 INSTEAD OF 触发器使用。
(4)DDL触发器不会创建插入(inserted)的和删除(deleted)的表.但是可以使用EVENTDATA函数捕获有关信息。
5.例题:
复制代码
--例题1
--服务器范围的DDL触发器
IF EXISTS ( SELECT  *
            FROM    sys.server_triggers
            WHERE   name = 'TR_CREATEDATABASE' ) 
    DROP TRIGGER TR_CREATEDATABASE ON ALL SERVER ;
GO
CREATE TRIGGER TR_CREATEDATABASE
ON ALL SERVER 
FOR CREATE_DATABASE 
AS 
    PRINT 'Database Created'
    PRINT CONVERT (nvarchar (1000),EventData())
GO
--创建数据库db1
CREATE DATABASE db1;
复制代码
--收到下列消息
Database Created
<EVENT_INSTANCE><EventType>CREATE_DATABASE</EventType><PostTime>2008-09-01T20:17:35.170</PostTime><SPID>52</SPID><ServerName>YANFA0</ServerName><LoginName>YANFA0\Administrator</LoginName><DatabaseName>db1</DatabaseName><TSQLCommand><SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE"/><CommandText>CREATE DATABASE db1;</CommandText></TSQLCommand></EVENT_INSTANCE>
复制代码
--例题2
--服务器范围的DDL触发器
IF EXISTS ( SELECT  *
            FROM    sys.triggers
            WHERE   name = N'TR_DROPINDEX'
                    AND parent_class = 0 ) 
    DROP TRIGGER [TR_DROPINDEX] ON DATABASE
GO
CREATE TRIGGER TR_DROPINDEX
ON DATABASE 
FOR DROP_INDEX
AS
    PRINT 'DROP INDEX'
    ROLLBACK
GO
--建立表
CREATE TABLE TableTest ( ids INT, i NVARCHAR(100) )
GO
--建立唯一索引
CREATE UNIQUE INDEX  index_TableTest 
ON TableTest ( ids )
GO
--删除索引
DROP INDEX index_TableTest
ON TableTest
GO
复制代码
--收到下列消息
--我们从消息可以看到删除索引不成功!
DROP INDEX
消息 3609,级别 16,状态 2,第 2 行
事务在触发器中结束。批处理已中止。
复制代码
--例题3
--当不再需要某个DDL触发器时,可以禁用或删除该触发器。 
--禁用DDL触发器不会将其删除。该触发器仍然作为对象存在于当前数据库中。
--但是,当运行编写触发器程序所用的任何DDL语句时,不会激发触发器。
--可以重新启用禁用的DDL触发器。
DISABLE TRIGGER [TR_DROPINDEX] ON DATABASE
GO
ENABLE TRIGGER [TR_DROPINDEX] ON DATABASE
GO
复制代码
我的系列文章
A.Sql Server2005 Transact-SQL 新兵器学习 
B.MCAD学习 
C.代码阅读总结 
D.ASP.NET状态管理 
E.DB(数据库) 
F.WAP 
G.WinForm 
H.Flex
我的好文推荐
FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8> 
Sql Server2005 Transact-SQL 新兵器学习总结之-总结 
MS SQL数据库备份和恢复存储过程(加强版本) 
sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结) 
ASP.NET2.0国际化/本地化应用程序的实现总结(多语言,多文化页面的实现) 
WAP开发资料站(最新更新) 
自定义格式字符串随笔 (IFormattable,IFormatProvider,ICustomFormatter三接口的实现) 
Mcad学习笔记之异步编程(AsyncCallback 委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结) 
Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法) 
Mcad学习笔记之序列化(2进制和Soap序列 化) 
Mcad学习笔记之委托再理解(delegate的构造器,BeginInvoke,EndInvoke,Invoke4个方法的探讨) 
ASP.NET状态管理之一(概括篇) 
Flex,Fms学习笔记
本文转自aierong博客园博客,原文链接:http://www.cnblogs.com/aierong/archive/2008/09/02/1281488.html,如需转载请自行联系原作者
你可能感兴趣的文章
Sql 获取当前日期没有时分秒
查看>>
mybatis_mapper动态代理
查看>>
CoreData一些基本概念
查看>>
1.java soap api操作和发送soap消息
查看>>
AJAX请求 $.ajaxSetup方法的使用
查看>>
background-size搭配transition实现鼠标hover背景图放大问题
查看>>
Redis分布式锁
查看>>
spark/java连接 kudu incompatible RPC? Error is: step 异常解决
查看>>
流程控制、数据类型(列表)
查看>>
vc6.0 获取ip(一)
查看>>
zt:华为手机的梦想:不破苹果终不还
查看>>
jzoj5990. 【北大2019冬令营模拟2019.1.6】Bear (状压dp)
查看>>
在CentOS上安装Python3的三种方法
查看>>
[PKUWC2018]随机算法
查看>>
《大话设计模式》读书笔记-第25章 中介者模式
查看>>
spring mvc-@CookieValue注解
查看>>
vue-router跳转到相同路由但页面没刷新
查看>>
2 .1 .6 软件要求
查看>>
断言函数
查看>>
oracle11gr2 netca 无法启动 报错
查看>>