SQL Server DDL触发器
DDL 触发器作用:
DDL 触发器主要用于防止对数据库架构、视图、表、存储过程等进行的某些修改。
DDL 触发器事件:
DDL 触发器在创建用来监视并响应该数据库或服务器实例中的活动的事件通知时,可以指定相应事件类型或事件组。
DDL 触发器类别:
DDL 触发器分为:数据库(DataBase)级别和服务器(Server)级别
DDL 数据库(DataBase)级别触发器:
因为 DDL 触发器不在架构范围内,所以不会在 sys.objects 目录视图中出现,无法使用 OBJECT_ID 函数来查询数据库中是否存在 DDL 触发器。
可以使用相应的目录视图来查询架构范围以外的对象。
对于 DDL 数据库级别触发器,可使用 sys.triggers 视图。对于 DDL 服务器级别触发器,可使用 sys.server_triggers 视图。
创建一个修改和删除表(table)的 DDL 数据库级别触发器:
-- 判断名为 trigger_DDL_Table 的数据库级别的触发器是否存在
if exists(select * from sys.triggers where parent_class=0 and name='trigger_DDL_Table') drop trigger trigger_DDL_Table on database --删除名为 trigger_DDL_Table 的数据库级别的触发器
go
create trigger trigger_DDL_Table -- 创建触发器
on database
for drop_table,alter_table -- 指定触发器事件
as print '触发器 trigger_DDL_Table 已禁止对表进行DDL的 drop、alter 操作'
rollback --对操作进行回滚
go drop table Student_back alter table Student_back add cc int null default(1)

创建一个在工作时间不允许创建、修改和删除视图(view)的 DDL 数据库级别触发器:
-- 判断名为 trigger_DDL_View 的数据库级别的触发器是否存在
if exists(select * from sys.triggers where parent_class=0 and name='trigger_DDL_View') drop trigger trigger_DDL_View on database --删除名为 trigger_DDL_View 的数据库级别的触发器
go
create trigger trigger_DDL_View -- 创建触发器
on database
for create_view,drop_view,alter_view -- 指定触发器事件
as
if(DATEPART(hour,getdate()) between 9 and 17)
begin
declare @EventData xml
set @EventData=EVENTDATA(); select '触发器 trigger_DDL_View 已禁止工作时间对视图进行DDL的 create、drop、alter 操作' select @EventData.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)') as EventType, --事件类型
@EventData.value('(/EVENT_INSTANCE/PostTime)[1]','nvarchar(max)') as PostTime, --事件触发的时间
@EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)') as DatabaseName, --数据库名
@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)') as ObjectName, --操作的对象名称
@EventData.value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(max)') as ObjectType, --操作的对象类型
@EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') as CommandText --操作命令文本 rollback --对操作进行回滚,也可以不回滚
end
go drop view v_Stu_Cou -- 删除视图

启用和禁用数据库级别触发器:
-- 启用名为 trigger_DDL_View 的数据库级别触发器
enable trigger trigger_DDL_View on database; -- 禁用名为 trigger_DDL_View 的数据库级别触发器
disable trigger trigger_DDL_View on database;
查看数据库级别的触发器及事件:
--数据库级别触发器视图
select * from sys.triggers --数据库级别触发器事件视图
select * from sys.trigger_events --查看数据库级别的触发器及事件
select a.name,a.parent_class_desc,b.type_desc
from sys.triggers a
inner join sys.trigger_events b
on a.object_id=b.object_id
EVENTDATA( ) 函数:可以在触发器内部(即 create 的 T-SQL 中)使用,当事件触发时,该函数返回一个 XML 数据类型,其中包含触发器的事件信息。
-- 当触发器执行时,该函数会返回触发器的事件信息。
select EVENTDATA();

当返回 XML 类型的结果,可以点击进行查看:
<EVENT_INSTANCE>
<EventType>DROP_VIEW</EventType> -- 事件类型
<PostTime>2017-04-23T16:29:58.130</PostTime> -- 事件执行时间
<SPID>52</SPID>
<ServerName>DESKTOP-LQUB0OA</ServerName> -- 计算机名称
<LoginName>sa</LoginName> -- 登陆用户名
<UserName>dbo</UserName> -- 用户(即所有者)
<DatabaseName>Test</DatabaseName> -- 数据库名
<SchemaName>dbo</SchemaName> -- 所有者
<ObjectName>v_Stu_Cou</ObjectName> -- 对象名
<ObjectType>VIEW</ObjectType> --对象类型
<TSQLCommand> -- T-SQL 命令
<SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
<CommandText>drop view v_Stu_Cou -- 删除视图</CommandText> -- 命令文本
</TSQLCommand>
</EVENT_INSTANCE>
更多关于 EVENTDATA() 函数请参考:
https://docs.microsoft.com/en-us/sql/t-sql/functions/eventdata-transact-sql
DDL 服务器(Server)级别触发器:
创建一个创建、修改、删除数据库的服务器级别触发器:
-- 判断名为 trigger_DDL_DB 的服务器级别的触发器是否存在,注意这里使用的是 sys.server_triggers 这个视图
if exists(select * from sys.server_triggers where name='trigger_DDL_DB') drop trigger trigger_DDL_DB on all server --删除名为 trigger_DDL_DB 的服务器级别的触发器
go
create trigger trigger_DDL_DB -- 创建触发器
on all server
for create_database,drop_database,alter_database -- 指定触发器事件
as
declare @EventData xml
set @EventData=EVENTDATA(); -- 当触发器执行时,该函数会返回触发器的事件信息。
select EVENTDATA(); select '触发器 trigger_DDL_DB 已禁止创建、修改、删除数据库操作' select @EventData.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)') as EventType, --事件类型
@EventData.value('(/EVENT_INSTANCE/PostTime)[1]','nvarchar(max)') as PostTime, --事件触发的时间
@EventData.value('(/EVENT_INSTANCE/ServerName)[1]','nvarchar(max)') as ServerName, --计算机名
@EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)') as DatabaseName, --数据库名
@EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') as CommandText --操作命令文本 rollback --对操作进行回滚,也可以不回滚
go create database Demo -- 创建数据库
on primary
(
name = N'DemoDB_Data',
filename = N'D:\DemoDB_Data.mdf',
size = 5mb,
maxsize = unlimited,
filegrowth = 5%
)
log on
(
name=N'DemoDB_log',
filename=N'D:\DemoDB_log.ldf',
size = 2mb,
maxsize = unlimited,
filegrowth = 1%
)

启用和禁用服务器级别触发器:
-- 启用名为 trigger_DDL_DB 的服务器级别触发器
enable trigger trigger_DDL_DB on all server; -- 禁用名为 trigger_DDL_DB 的服务器级别触发器
disable trigger trigger_DDL_DB on all server;
查看服务器级别触发器及事件:
--服务器级别的触发器视图
select * from sys.server_triggers --服务器级别的触发器事件视图
select * from sys.server_trigger_events --查看服务器级别的触发器及事件
select a.name,a.parent_class_desc,b.type_desc
from sys.server_triggers a
inner join sys.server_trigger_events b
on a.object_id=b.object_id
参考:
http://www.cnblogs.com/qanholas/archive/2012/05/10/2494643.html
https://msdn.microsoft.com/zh-cn/library/ms190989(v=sql.100).aspx
SQL Server DDL触发器的更多相关文章
- SQL Server DDL触发器运用
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) DDL运用场景(DDL Scene) ...
- 数往知来SQL SERVER 视图 触发器 <九>
SQL server学习_视图 1.视图 视图其实是一张虚拟表,他是一张表的部分数据或多张表的综合数据(视图就是把SQL语句封装起来) 可以看做是一个结果集,但是不是一个结果集 视图不具备存储数据的能 ...
- SQL SERVER TRIGGER 触发器
1.触发器简介 触发器是一种特殊的存储过程,它的执行不是由程序调用,也不是手动执行,而是由事件来触发.触发器是当对某一个表进行操作.例如:update.insert.delete这些操作的时候,系统会 ...
- sql server中触发器
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- SQL Server:触发器详解
1. 概述 触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活. 所以触发器可以用来实现对表实施复杂的完整性约束. 2. 触发器的分类 SQL S ...
- sql server知道触发器名如何查看里面代码
以sqlserver2008为例,可以写代码查看,也可以通过SQL Server Manager Studio工具的树形列表查看. 一.代码查看: 直接在SQL Server Manager Stud ...
- 记一次SQL Server Insert触发器编写过程
实现功能:新增特定类型的新闻时,自动追加特定的背景图片. 第一版(错误信息:不能在 'inserted' 表和 'deleted' 表中使用 text.ntext 或 image 列),代码如下: - ...
- 【SQL SERVER】触发器(一)
下面是个人对触发器知识的整理,触发器其实很简单,但想要编写发杂的触发器操作还是需要一定的SQL语句编写,触发器主要用于SQL SERVER约束.默认值和规则的完整性检查,还可以实现由主键和外键不能保证 ...
- SQL Server 使用触发器(trigger)发送电子邮件
sql 使用系统存储过程 sp_send_dbmail 发送电子邮件语法: sp_send_dbmail [ [ @profile_name = ] 'profile_name' ] [ , [ @r ...
随机推荐
- js调绝对定位的top
$("ggg div").each(function () { this.style.top = (parseFloat(this.style.top ...
- iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
在调试接口的时候,遇到一个问题,就是多张图片上传的时候,不管我上传多少张,只会上传成功最后一张,也就是说只有一张图片上传成功了,针对这个问题,通过查找资料,找到了原因,首先,在上传的过程中,我们获取到 ...
- 《C++ Primer Plus》学习笔记——C++程序创建到运行的整个过程
当你编写了一个C++,如何让它运行起来呢?具体的步骤取决于计算机环境和使用的C++编译器,但大体如下: 1.使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码. 2.编译源代码.这意 ...
- mybatis设置数据库连接的密码不需要加密
mybatis设置数据库连接的密码不需要加密:在数据库连接配置处加上:<property name="connectionProperties" value="co ...
- vector排序问题<unresolved overloaded function type>
要对vector中的自定义类型进行排序,首先需要提供一个函数bool comp(const Interval & a, const Interval & b) 来定义类型的排序准则 然 ...
- vue兄弟组件传值
vue中除了父子组件传值,父传子用props,子传父用$emit,有时候兄弟组件之间也需要传值 1. 先定义一个中间件,src下面新建self.js import Vue from 'vue'; le ...
- 160310、oracle数据库的读写分离
PS:使用AbstractRoutingDataSource路由数据源实现动态数据库的调用 1. 连接哪个数据源的环境变量 package com.hysoft.common; public ...
- node npm
node.js -npm 查看npm版本号$ npm -v 全局安装npm$ npm install npm -g 安装模块$ npm install <module name> --本地 ...
- Java进阶SQL函数、网页定时刷新与自定义JSTL函数
一.SQL函数 能够在SQL语句中调用的函数(方法) ,用来实现一些小功能 聚合函数 能够把多行数据聚合成一个值(统计) count() 计数,计算数据条数 max() 计算最大值 m ...
- 20165330 2017-2018-2 《Java程序设计》第6周学习总结
课本知识总结 第八章 常用实用类 String类 String对象 构造方法: 使用String类声明对象并创建对象 String s = new String("we are studen ...