热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SqlServer2005Transact-SQL新兵器学习总结之-DDL触发器

1.简介:SqlServer2005新增加了DDL触发器。与DML触发器不同的是,它们不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而激发。相反,它们将为了响应各种数据定义语言


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
CREATE_DATABASE2008-09-01T20:17:35.17052YANFA0YANFA0\Administratordb1CREATE DATABASE db1;


-- 例题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


推荐阅读
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • MySQL插入数据的四种方式及安全性分析
    本文介绍了MySQL插入数据的四种方式:插入完整的行、插入行的一部分、插入多行和插入查询结果,并对其安全性进行了分析。在插入行时,应注意字段的定义和赋值,以提高安全性。同时指出了使用insert语句的不安全性,应尽量避免使用。建议在表中定义相关字段,并根据定义的字段赋予相应的值,以增加插入操作的安全性。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 【前言】:在19年8月份的时候,为地产行业客户实施了一套简要的CampaignInfluence模型,目的是帮助房产公司市场部同事了解什么类型的Campaign有助于产生新的商机, ... [详细]
  • 小编这次要给大家分享的是详解Python定时任务APScheduler,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获 ... [详细]
  • SpringBoot2.x学习笔记——定时任务使用与持久化
    SpringBoot2.x学习笔记—— ... [详细]
author-avatar
森南有鹿63N
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有