DDL触发器原理

DDL 触发器用于响应各种数据定义语言 (DDL) 事件。 这些事件主要与以关键字 CREATE、ALTER、DROP、GRANT、DENY、REVOKE 或 UPDATE STATISTICS 开头的 Transact-SQL 语句对应。 执行 DDL 式操作的系统存储过程也可以激发 DDL 触发器。

DDL触发器在数据库或模式级运行,DDL触发器通常用于记录数据库的修改过程和监控数据库中的重要事件。

DDL触发器创建

语法:

--声明数据库引用

use 数据库名;

go

--判断是否存在要创建的触发器,如果存在则删除

if exists(select * from sys.triggers where name=触发器名)

drop trigger 触发器名 on { database | all server };

go

--创建触发器

create

--触发器标识符

trigger

--DML 触发器所属架构的名称。 DML 触发器的作用域是为其创建该触发器的表或视图的架构。 不能为 DDL 或登录触发器指定 schema_name。

--[ schema_name .]

--触发器名称

触发器名

--ALL SERVER

--适用范围: SQL Server 2008 到 SQL Server 2017。

--将 DDL 或登录触发器的作用域应用于当前服务器。 如果指定了此参数,则只要当前服务器中的任何位置出现 event_type 或 event_group,就会激发该触发器。

--database

--将 DDL 触发器的作用域应用于当前数据库。 如果指定了此参数,则只要当前数据库中出现 event_type 或 event_group,就会激发该触发器。

on { database | all server }

[with]

--适用范围: SQL Server 2008 到 SQL Server 2017。

--对 CREATE TRIGGER 语句的文本进行模糊处理。 使用 WITH ENCRYPTION 可以防止将触发器作为 SQL Server 复制的一部分进行发布。 不能为 CLR 触发器指定 WITH ENCRYPTION。

[encryption][,]

--EXECUTE AS Clause

--{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }

--CALLER

--指定模块内的语句在模块调用方的上下文中执行。 执行模块的用户不仅必须对模块本身拥有适当的权限,还要对模块引用的任何数据库对象拥有适当权限。

--CALLER 是除队列外的所有模块的默认值,与 SQL Server 2005 行为相同。

--CALLER 不能在 CREATE QUEUE 或 ALTER QUEUE 语句中指定。

--SELF

--EXECUTE AS SELF 与 EXECUTE AS user_name 等价,其中指定用户是创建或更改模块的用户。 创建或更改模块的用户的实际用户 ID 存储在 sys.sql_modules 或 sys.service_queues 目录视图的 execute_as_principal_id 列中。

--SELF 是队列的默认值。

--OWNER

--指定模块内的语句在模块的当前所有者上下文中执行。 如果模块没有指定的所有者,则使用模块架构的所有者。 不能为 DDL 或登录触发器指定 OWNER。

--' user_name '

--指定模块内的语句在 user_name 指定的用户的上下文中执行。 将根据 user_name 来验证对模块内任意对象的权限。 不能为具有服务器作用域的 DDL 触发器或登录触发器指定 user_name。 请改用 login_name。

--user_name 必须存在于当前数据库中,并且必须是单一实例帐户。 user_name 不能为组、角色、证书、密钥或内置帐户,如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。

--执行上下文的用户 ID 存储在元数据中,可以在 sys.sql_modules 或 sys.assembly_modules 目录视图的 execute_as_principal_id 列查看。

[execute as caller]

--FOR | AFTER

--AFTER 指定 DML 触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。 所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。

--如果仅指定 FOR 关键字,则 AFTER 为默认值。

--不能对视图定义 AFTER 触发器。

{ for | after }

--event_type

--执行之后将导致激发 DDL 触发器的 Transact-SQL 语言事件的名称。 DDL 事件中列出了 DDL 触发器的有效事件。

--event_group

--预定义的 Transact-SQL 语言事件分组的名称。 执行任何属于 event_group 的 Transact-SQL 语言事件之后,都将激发 DDL 触发器。 DDL 事件组中列出了 DDL 触发器的有效事件组。

--CREATE TRIGGER 运行完成后,event_group 还将充当宏,将它涉及的事件类型添加到 sys.trigger_events 目录视图中。

{ event_type | event_group }

as

begin

sql_statement;

end

go

示例:

--声明数据库引用

use testss;

go

--判断是否存在要创建的触发器,如果存在则删除

if exists(select * from sys.triggers where name='ddltri')

drop trigger ddltri on database;

go

--创建触发器

create

--触发器标识符

trigger

--DML 触发器所属架构的名称。 DML 触发器的作用域是为其创建该触发器的表或视图的架构。 不能为 DDL 或登录触发器指定 schema_name。

--[ schema_name .]

--触发器名称

ddltri

--ALL SERVER

--适用范围: SQL Server 2008 到 SQL Server 2017。

--将 DDL 或登录触发器的作用域应用于当前服务器。 如果指定了此参数,则只要当前服务器中的任何位置出现 event_type 或 event_group,就会激发该触发器。

--database

--将 DDL 触发器的作用域应用于当前数据库。 如果指定了此参数,则只要当前数据库中出现 event_type 或 event_group,就会激发该触发器。

on database

with

--适用范围: SQL Server 2008 到 SQL Server 2017。

--对 CREATE TRIGGER 语句的文本进行模糊处理。 使用 WITH ENCRYPTION 可以防止将触发器作为 SQL Server 复制的一部分进行发布。 不能为 CLR 触发器指定 WITH ENCRYPTION。

encryption,

--EXECUTE AS Clause

--{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }

--CALLER

--指定模块内的语句在模块调用方的上下文中执行。 执行模块的用户不仅必须对模块本身拥有适当的权限,还要对模块引用的任何数据库对象拥有适当权限。

--CALLER 是除队列外的所有模块的默认值,与 SQL Server 2005 行为相同。

--CALLER 不能在 CREATE QUEUE 或 ALTER QUEUE 语句中指定。

--SELF

--EXECUTE AS SELF 与 EXECUTE AS user_name 等价,其中指定用户是创建或更改模块的用户。 创建或更改模块的用户的实际用户 ID 存储在 sys.sql_modules 或 sys.service_queues 目录视图的 execute_as_principal_id 列中。

--SELF 是队列的默认值。

--OWNER

--指定模块内的语句在模块的当前所有者上下文中执行。 如果模块没有指定的所有者,则使用模块架构的所有者。 不能为 DDL 或登录触发器指定 OWNER。

--' user_name '

--指定模块内的语句在 user_name 指定的用户的上下文中执行。 将根据 user_name 来验证对模块内任意对象的权限。 不能为具有服务器作用域的 DDL 触发器或登录触发器指定 user_name。 请改用 login_name。

--user_name 必须存在于当前数据库中,并且必须是单一实例帐户。 user_name 不能为组、角色、证书、密钥或内置帐户,如 NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService 或 NT AUTHORITY\LocalSystem。

--执行上下文的用户 ID 存储在元数据中,可以在 sys.sql_modules 或 sys.assembly_modules 目录视图的 execute_as_principal_id 列查看。

execute as caller

--FOR | AFTER

--AFTER 指定 DML 触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。 所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。

--如果仅指定 FOR 关键字,则 AFTER 为默认值。

--不能对视图定义 AFTER 触发器。

for

--event_type

--执行之后将导致激发 DDL 触发器的 Transact-SQL 语言事件的名称。 DDL 事件中列出了 DDL 触发器的有效事件。

--event_group

--预定义的 Transact-SQL 语言事件分组的名称。 执行任何属于 event_group 的 Transact-SQL 语言事件之后,都将激发 DDL 触发器。 DDL 事件组中列出了 DDL 触发器的有效事件组。

--CREATE TRIGGER 运行完成后,event_group 还将充当宏,将它涉及的事件类型添加到 sys.trigger_events 目录视图中。

create_table,alter_table,drop_table

as

begin

print('你触发了ddl触发器');

end

go

示例结果:

DDL触发器优缺点

优点:

  1、记录数据库的修改过程。

  2、监控数据库中的重要事件。

  3、防止对数据库架构执行恶意更改。

  4、更加安全。

  5、通过使用 EVENTDATA( ) 函数,可以在触发器中使用XML信息。

缺点:

  1、滥用会造成数据库及应用程序的维护困难。

SQLServer之创建Transact-SQL DDL触发器相关推荐

  1. DDL触发器与DML触发器比较

    DML触发器 DML触发器就是普通的  INSERT / UPDATE / DELETE 触发器. DDL触发器就是一些特有的 DDL 语句的触发器. 例如:登陆到服务器的触发, 创建数据库的触发.  ...

  2. oracle数据库登录失败触发器,oracle数据库登录、DDL触发器的应用

    登录触发器 oracle登录记录触发器: 1.创建日志记录表: CREATE TABLE SYSTEM.LOGIN_LOG ( SESSION_ID NUMBER, LOGIN_ON_TIME DAT ...

  3. SQLServer之创建AFETER DELETE触发器

    DML AFTER DELETE触发器创建原理 触发器触发时,系统自动在内存中创建deleted表或inserted表,inserted表临时保存了插入或更新后的记录行,deleted表临时保存了删除 ...

  4. 监控SQL:通过SQL Server的DDL触发器来监控数据库结构的变化(1)

    如果你要同步不同数据库之间的数据,首先会想到的是数据库复制技术,但如果让你同步数据库的结构,你会想到什么呢? 下面是一个例子,用来说明通过sql server中的DDL触发器,来记录create ta ...

  5. SQL Server触发器创建、删除、修改、查看

    http://blog.csdn.net/tianwailaibin/article/details/8111766 本教程为大家介绍SQL Server触发器创建.删除.修改.查看方法. 一.触发器 ...

  6. SQL Server 创建update、delete触发器实例

    这学期刚刚学数据库,上课的时候老师主要讲的是理论.但是上机时需要实操写SQL语句,便觉得十分困难.数据库小白在大量的文章中搜索,发现许多文章对于小白来说非常不友好(maybe是笔者道行还不深),花了一 ...

  7. SQLSERVER数据库、表的创建及SQL语句命令

    SQLSERVER数据库.表的创建及SQL语句命令 备份,还原,创建,删除,查询,修改 ** 数据库定义及操作命令:** 按照数据结构来组织.存储和管理数据的仓库.由表.关系以及操作对象组成,把数据存 ...

  8. sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议

    文章目录 1.触发器介绍 2.特点 3.DML触发器分类 4.inserted表与deleted表 4.1 表介绍 4.2 创建时机 5.定义触发器 5.1 定义触发器 5.2 分类 5.2.1 AF ...

  9. SQL Server 触发器学习总结

    SQL菜鸟入门级教程之触发器 触发器简介:   触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件 ...

  10. 触发器系列一之DDL触发器

    近期出于同步数据的需求,需要创建一个具有在目标数据库具有alter table权限的帐号,但是由于该工具在alter table同步表结构时会同时频繁发起create index和drop index ...

最新文章

  1. Chrome 调试技巧
  2. 【转】WPF之路-常用布局控件一
  3. 计算机中国象棋书籍,[建议]中国的象棋永远不能被没有“思维”的电脑所代替(就目前的电脑象棋软件...
  4. 使用JS清空fileupload 控件值
  5. 计蒜客挑战难题:A+B+C问题
  6. sed用法详解(转载)
  7. CouchBase简单介绍
  8. linux curl证书错误,curl – SSL证书错误
  9. 中文谚语 enlish version
  10. 无法使用此电子邮件地址。请选择其他电子邮件地址
  11. Python 七段数码管
  12. C语言中全局数组外部引用的小问题
  13. html div位于居中元素右边,如何居中一个元素(终结版)
  14. 开源电子原型平台 Arduino
  15. 计算机系统应用的书,基于个性化图书推荐的协同过滤算法
  16. Jackson 解析j@JsonIgnorePropertiesson数据之忽略解析字段注解
  17. android存储文件数据恢复,安卓手机文件如何恢复?
  18. 全国计算机考试励志语,鼓励考试的经典语句 为考试加油的暖心句子
  19. OpenCV函数库查询手册(python)
  20. 图像增强的GUI设计

热门文章

  1. asm 与 cglib(整理的)
  2. J2ME-CLDC/MIDP资源
  3. netty mysql 中间件_阿里开源Mysql分布式中间件:Cobar
  4. 拜托,面试别再问我基数排序了!!!
  5. L1-025__032
  6. 淘宝商品比价定向爬虫
  7. 绘图添加网格_Stata绘图: 添加虚线网格线
  8. 同步升压与异步升压_单相220V转三相380V升压变频器
  9. udp聊天室的界面实现
  10. linux python测试程序,linux下测试python程序执行时间