当前位置: 首页 > news >正文

SQL Server 2005 触发器应用

SQL Server 2005增加功能之一就是数据定义语言 (DDL) 触发器。在SQL Server 7.0和2000中,我们使用数据操作语言 (DML) 触发器,当INSERT,UPDATE或者DELETE语句被执行的时候执行一段SQL语句或存储过程,它们只能用于表或视图。

  在SQL Server 2005中,我们可以在DDL语句上建立一个触发器来执行任何操作。触发器的作用范围可以是数据库层或是服务器层。DDL触发器常用在数据库结构要变更的时候你期望的某个动作被执行。

  让我们在数据库上建立一个触发器阻止任何用户Create,Alter和Drop表或存储过程。我们假定我们有一个数据库叫DDLTrTest,这个数据库中有一个表(MyTable)和一个存储过程(Usp_QueryMyTable)。

  用下面的语句创建数据库,表和存储过程。
USE [MASTER]
GO
IF  EXISTS (SELECT NAME FROM SYS.DATABASES WHERE NAME = N'DDLTRTEST')
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触发器STOP_DDL_on_Table_and_PROC。

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;

  这里我们使用了一个SQL Server 2005提供的新函数EVENTDATA()来捕获SQL语句。

  现在我们尝试用下面这个命令来给Mytable增加一个列。
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.

  让我们尝试删除表MyTable
Drop Table MyTable

  结果将会这样:
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 PROCEDURE USP_QUERYMYTABLE2 AS
SELECT TOP 100 * FROM MyTable

  结果将会这样
CREATE PROCEDURE USP_QUERYMYTABLE2 AS
SELECT TOP 100 * FROM MYTABLE
(1 row(s) affected)
You are not allowed to CREATE,ALTER and DROP any Tables and Procedures
Msg 3609, Level 16, State 2, Procedure USP_QUERYMYTABLE2, Line 3
The transaction ended in the trigger. The batch has been aborted.

STOP_DDL_on_Table_and_PROC这个DDL触发器只是应用在数据库DDLTrTest。在其他数据库上Create,Alter和Drop都可以执行。

  这些触发器可以用下面的命令来停用,启用或者删除。
DISABLE TRIGGER STOP_DDL_ON_TABLE_AND_PROC
ON DATABASE
GO
ENABLE TRIGGER STOP_DDL_ON_TABLE_AND_PROC
ON DATABASE
GO
DROP TRIGGER STOP_DDL_ON_TABLE_AND_PROC ON DATABASE
GO

  如果你想把这个触发器的作用范围从数据库层改变到服务器层,你可以像下面这样把ON DATABASE改成ON ALL SERVER。这个触发器就阻止用户

  执行Create,Alter和Drop数据库的操作。

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;

  现在,我们再来试一下创建,修改和删除一个数据库。

USE MASTER
GO
CREATE DATABASE TEST
GO
ALTER DATABASE DDLTRTEST MODIFY FILE
(
NAME = DDLTRTEST,
FILENAME='D:\DDLTRTEST.MDF')
GO
USE MASTER
GO
DROP DATABASE DDLTRTEST
GO

  结果如下:

You are not allowed to CREATE,ALTER and DROP any Databases
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.
The file "DDLTRTEST" has been modified in the system catalog.
  The new path will be used the next time the database is started.
You are not allowed to CREATE,ALTER and DROP any Databases
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.
You are not allowed to CREATE,ALTER and DROP any Databases
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.

  服务器层级的触发器可以用下面的命令来停用,启用或者删除。

DISABLE TRIGGER STOP_DDL_ON_TABLE_AND_PROC
ON ALL SERVER
GO
ENABLE TRIGGER STOP_DDL_ON_TABLE_AND_PROC
ON ALL SERVER
GO
DROP TRIGGER STOP_DDL_ON_TABLE_AND_PROC ON ALL SERVER
GO

总结
  这篇文章主要探索了SQL Server 2005的新特性DDL触发器和EVENTDATA()函数。

转载于:https://www.cnblogs.com/happybird0353/archive/2008/06/30/1232507.html

相关文章:

  • hadoop-hdfs文件系统的安装与部署
  • 第四篇:数据预处理(一) - 缺失值处理
  • HDU 2586 How far away ?(LCA模板 近期公共祖先啊)
  • Mocha BSM产品亮点——报告管理
  • Spring-data-jpa详解,全方位介绍。
  • 互联网DNS存在重大漏洞 黑客可能控制网络流量
  • 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出
  • 发布Web服务器上的虚拟主机:ISA2006系列之十一
  • NFS部署及优化(二)
  • java枚举与.net中的枚举区别
  • 在Hibernate中配置多对多连接表
  • ionic2 自定义cordova插件开发以及使用 (Android)
  • 语录十八
  • 什么样的_BUG_会让你目瞪口呆?
  • C#编程利器之二:结构与枚举(Structure and enumeration)
  • Android 控件背景颜色处理
  • CSS 三角实现
  • FineReport中如何实现自动滚屏效果
  • JavaScript的使用你知道几种?(上)
  • Nodejs和JavaWeb协助开发
  • 编写高质量JavaScript代码之并发
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何使用 JavaScript 解析 URL
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用Swoole加速Laravel(正式环境中)
  • 树莓派 - 使用须知
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​io --- 处理流的核心工具​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 透过事物看本质的能力怎么培养?
  • #pragma once与条件编译
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (办公)springboot配置aop处理请求.
  • (待修改)PyG安装步骤
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (动态规划)5. 最长回文子串 java解决
  • (规划)24届春招和25届暑假实习路线准备规划
  • (力扣)循环队列的实现与详解(C语言)
  • (四)图像的%2线性拉伸
  • *1 计算机基础和操作系统基础及几大协议
  • .net Application的目录
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .Net6 Api Swagger配置
  • .NetCore项目nginx发布
  • .net和jar包windows服务部署
  • .NET基础篇——反射的奥妙
  • .net中的Queue和Stack
  • @TableLogic注解说明,以及对增删改查的影响
  • [ NOI 2001 ] 食物链
  • [ 转载 ] SharePoint 资料
  • [BJDCTF2020]The mystery of ip1
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C++打怪升级]--学习总目录