经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库运维 » MS SQL Server » 查看文章
SQL Server基础之库级触发器
来源:cnblogs  作者:刀奈特程序员  时间:2018/10/8 9:02:59  对本文有异议

  触发器分为两种,一种与数据表绑定,响应数据表指定动作(insertdeleteupdate),此处称为表级;一种与数据库本身绑定,响应数据定义(DDL)语句(主要是CREATEALTER DROP 开头的语句),此处称为库级。本篇以下所说触发器皆指库级触发器。

  触发器(又名DDL触发器)是一段有特定语法,实现一定功能的SQL语句,它与数据库本身绑定,当数据发生指定动作(主要是CREATEALTER DROP 开头的语句完整响应事件请看这里)时,由数据库自动调用。触发器可以选择绑定某一个特定的数据库,也可以选择绑定所有的数据库。当绑定特定数据库时,触发器位于图1红框位置,当绑定所有数据库时,位于图2红框位置。无论是绑定特定数据库还是绑定所有数据库的触发器,均可以同时存在多个,并且响应同一事件的触发器也可以同时存在多个。当存在多个响应同一事件的触发器时,按触发器建立时间先后决定执行顺序,先建立的先执行。触发器是不能修改的,如果需要修改,必须先删除再新建。值得特别注意的是,绑定所有数据库时触发器可以响应服务器级别的事件,如CREATE_DATABASE,而绑定特定数据库时,只能响应与该数据库相关的事件

   触发器主要用于防止或者记录对数据库架构的更改。下面是一个防止非sa用户创建表、绑定所有数据库的触发器。

  1. USE [master]
  2. GO
  3. create trigger [tr_FanZhiFeiSaChuangJianBiao]
  4. on all server --作用于SQL Server实例下所有库
  5. for CREATE_TABLE
  6. as
  7. --获取事件数据
  8. DECLARE @data XML
  9. SET @data = EVENTDATA()
  10. --获取用户名
  11. declare @LoginName nvarchar(150)
  12. set @LoginName = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname')
  13. --如果用户名不是sa则回滚
  14. if @LoginName<>'sa'
  15. begin
  16. rollback
  17. return
  18. end

触发器的语法:

  1. CREATE TRIGGER trigger_name --触发器的名字
  2. ON {database | all server} --确定触发器是绑定特定数据还是所有数据库,database代表绑定特定数据库
  3. {FOR | CREATE_TABLE|CREATE_PROCEDURE } --确定触发器响应事件,可以同时绑定多个,多个时使用‘,’分隔,绑定所有事件使用DDL_SERVER_LEVEL_EVENTS
  4. AS
  5. sql_statement --你需要编写的SQL语句
  1. --删除绑定所有数据库的触发器
  2. drop trigger trigger_name on all server
  3. --删除绑定特定数据库的触发器
  4. drop trigger trigger_name on database
  1. -- 启动绑定特定数据库的触发器
  2. enable trigger trigger_name on database;
  3. -- 禁用名绑定特定数据库的触发器
  4. disable trigger trigger_name on database;
  5. -- 启动绑定所有数据库的触发器
  6. enable trigger trigger_name on all server;
  7. -- 禁用名绑定所有数据库的触发器
  8. disable trigger trigger_name on all server;
  1. --查询绑定特定数据库的触发器
  2. select * from sys.triggers
  3. --查询绑定所有数据库的触发器
  4. select * from sys.server_triggers
  5. /*触发器不存在于sys.objects 目录视图中,无法对其使用OBJECT_ID 函数*/

  在触发器里使用 EVENTDATA()函数,可以获得触发器上下文事件信息。其返回的是一个XML文件,典型内容如下图。

  1. --读取 EVENTDATA()返回的XML
  2. DECLARE @data XML
  3. SET @data = EVENTDATA()
  4. --读取XML节点
  5. DECLARE @dbName nvarchar(250)
  6. SET @dbName = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname')

 写作时间:2018-10-05

 

=====================================================================================
本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号