`

sql server 2005中的DDL触发器

阅读更多
   SQL SERVER 2005中,新增加了许多新的特性,其中的DDL触发器是个不错的选择,根据资料初步学习如下,现整理之:
   在sql server 2000中,只能为针对表发出的 DML 语句(INSERT、UPDATE 和 DELETE)定义 AFTER 触发器。SQL Server 2005 可以就整个服务器或数据库的某个范围为 DDL 事件定义触发器。可以为单个 DDL 语句(例如,CREATE_TABLE)或者为一组语句(例如,DDL_DATABASE_LEVEL_EVENTS)定义 DDL 触发器。在该触发器内部,您可以通过访问 eventdata() 函数获得与激发该触发器的事件有关的数据。该函数返回有关事件的 XML 数据。每个事件的架构都继承了 Server Events 基础架构。
    比如,在SQL SERVER 2005中,建立一个叫DDLTrTest 的数据库,并且建立一个叫mytable的表
和Usp_Querymytable 的存储过程,如下所示
    DROP DATABASE [DDLTRTEST]
GO
CREATE DATABASE DDLTRTEST
GO
USE [DDLTRTEST]
GO
IF  EXISTS (SELECT * FROM SYS.OBJECTS
  WHERE OBJECT_ID = OBJECT_ID(N'[DBO].[MYTABLE]')
  AND TYPE IN (N'U'))
DROP TABLE [DBO].[MYTABLE]
GO
CREATE TABLE MYTABLE(ID INT, NAME VARCHAR(100))
GO
INSERT INTO MYTABLE SELECT 1,'A'
INSERT INTO MYTABLE SELECT 2,'B'
INSERT INTO MYTABLE SELECT 3,'C'
INSERT INTO MYTABLE SELECT 4,'D'
INSERT INTO MYTABLE SELECT 5,'E'
INSERT INTO MYTABLE SELECT 6,'F'
GO
USE [DDLTrTest]
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id =
  OBJECT_ID(N'[dbo].[usp_querymytable]')
  AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[usp_querymytable]
GO
CREATE PROC USP_QUERYMYTABLE
AS
SELECT * FROM MYTABLE
GO

   接下来定义一个DDL触发器如下
  
CREATE TRIGGER STOP_DDL_on_Table_and_PROC
ON DATABASE 
FOR CREATE_TABLE,DROP_TABLE, 
  ALTER_TABLE,CREATE_PROCEDURE,
  ALTER_PROCEDURE,DROP_PROCEDURE
AS 
SELECT EVENTDATA().value
  ('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]',
  'nvarchar(max)')
PRINT 'You are not allowed to CREATE,ALTER and DROP 
  any Tables and Procedures' 
ROLLBACK;
   接下来,我们尝试如下的操作:
  ALTER TABLE MYTABLE ADD X INT
 结果如下,出现错误提示
  ALTER TABLE MYTABLE ADD X INT
(1 row(s) affected)
You are not allowed to CREATE,ALTER and DROP any Tables and Procedures
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.

    再执行DROP的操作,同样触发警告
DROP TABLE MYTABLE
(1 row(s) affected)
You are not allowed to CREATE,ALTER and DROP any Tables and Procedures
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.
   因为我们的触发器规定了不能使用CREATE_TABLE,DROP_TABLE, 
  ALTER_TABLE,CREATE_PROCEDURE,
  ALTER_PROCEDURE,DROP_PROCEDURE等操作。

如果我们要关掉这个触发器,可以这样做:
DISABLE TRIGGER STOP_DDL_ON_TABLE_AND_PROC ON DATABASE
当然,我们要对整个服务器采取策略的话,也是很简单的,和上面的方法大致相同
只不过将on database的参数改为on server,比如
CREATE TRIGGER STOP_DDL_on_Table_and_PROC
ON ALL SERVER
FOR CREATE_DATABASE,ALTER_DATABASE,DROP_DATABASE
AS 
PRINT 'You are not allowed to CREATE,ALTER and DROP any Databases' 
ROLLBACK;

   

  
分享到:
评论

相关推荐

    浅析SQL Server2005中的DDL触发器技术.pdf

    浅析SQL Server2005中的DDL触发器技术.pdf

    sql 触发器 详解与实例

    触发器对表进行插入、更新、删除的时候会自动执行的特殊...SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

    SQL Server 2008中的代码安全(二) DDL触发器与登录触发器

    MicrosoftSQL Server 提供两种主要机制来强制使用业务规则和数据完整性:约束和触发器。触发器为特殊类型的存储过程,可在执行语言事件...SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。

    SQL Server误区30日谈 第4天 DDL触发器就是INSTEAD OF触发器

    误区 #4: DDL触发器(SQL Server 2005之后被引入)就是INSTEAD OF触发器 这是错误的  DDL触发器的实现原理其实就是一个AFTER触发器。这个意思是先发生DDL操作,然后触发器再捕捉操作(当然如果你在触发器内写了...

    SQl SERVER 高级应用讲解

    对SQL SERVER中的DDL触发器及like 和时间函数做了详细的讲解

    sqlserver 触发器学习(实现自动编号)

    总结常用基本点如下: 1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML触发器)。 DDL触发器:在用户对数据库执行数据定义(CREATE、ALTER、DROP或相似的语句)对数据库结构进行...

    SQL Server2005基础教程

    本书重点阐述了SQL Server 2005的基础知识,前半部分以建立一个金融数据库系统为主线,从最基础的收集信息入手,一步步地引导读者学会如何保证数据库的安全,创建表、主键、索引等项目,在表之间建立恰当的关系,并...

    SQL SERVER 触发器介绍

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。...SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有creat

    SQL2005入门到精通(13)

    283 13.6.2 启用触发器 285 13.7 设计CLR触发器 286 13.7.1 创建CLR触发器的一般步骤 286 13.7.2 创建CLR触发器的示例 286 13.8 设计DDL触发器 290 13.8.1 CREATE TRIGGER创建DDL触发器的语法 290...

    SQLSever中的触发器基本语法与作用

    SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。 SQL Server为每个触发器都创建了两个专用表﹕Insert

    深入浅析SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。...SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有cr

    SQL Server触发器及触发器中的事务学习

    在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器 & DDL触发器)和After触发器 & Instead Of 触发器的应用不同,开始说起它们,然后是说与事务有关的故事。如果,你有什么...

    SQLServer EVENTDATA()函数来获取DDL 触发器信息

    SQL Server 2005/2008中可以使用EVENTDATA函数来获取DDL触发器的上下文,从而在ROLLBACK之前截获DDL信息。EVENTDATA返回XML字段,下面的例子显示如何截获Drop Table的DDL信息。

    了解SQLServer触发器及触发器中的事务

    在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器&DDL触发器)和After触发器&InsteadOf触发器的应用不同,开始说起它们,然后是说与事务有关的故事。如果,你有什么建议和...

    SQL Server中事务,索引,触发器,游标

    文章目录 一、事务(一)事务的概念及要求(二)事务的特性(ACID)(三)事务的分类1.显示事务2.隐式事务3.自动提交事务(四)创建事务(五)...Data Manipulation Language)触发器2.DDL(数据定义语言,Data Definition L

    SQL Server 2000简明培训教程

    第1章 SQL Server 关系数据库简介 1.1 SQL Server 特点 1.2 SQL Server的安装和配置 1.3 SQL Server 工具和实用程序 第2章 Transact-SQL语言 2.1 数据定义语言(DDL) 2.2 数据操纵语言(DML) 2.3 数据控制...

Global site tag (gtag.js) - Google Analytics