SQL Server基础之库级触发器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SQL Server基础之库级触发器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2902字,纯文字阅读大概需要5分钟。
内容图文
![SQL Server基础之库级触发器](/upload/InfoBanner/zyjiaocheng/921/4fa21866bef846fc8f2f5b9138b412e1.jpg)
触发器分为两种,一种与数据表绑定,响应数据表指定动作(insert、delete或update),此处称为表级;一种与数据库本身绑定,响应数据定义(DDL)语句(主要是CREATE、ALTER 和 DROP 开头的语句),此处称为库级。本篇以下所说触发器皆指库级触发器。
触发器(又名DDL触发器)是一段有特定语法,实现一定功能的SQL语句,它与数据库本身绑定,当数据库发生指定动作(主要是CREATE、ALTER 和 DROP 开头的语句,完整响应事件请看这里)时,由数据库自动调用。触发器可以选择绑定某一个特定的数据库,也可以选择绑定所有的数据库。当绑定特定数据库时,触发器位于图1红框位置,当绑定所有数据库时,位于图2红框位置。无论是绑定特定数据库还是绑定所有数据库的触发器,均可以同时存在多个,并且响应同一事件的触发器也可以同时存在多个。当存在多个响应同一事件的触发器时,按触发器建立时间先后决定执行顺序,先建立的先执行。触发器是不能修改的,如果需要修改,必须先删除再新建。值得特别注意的是,绑定所有数据库时触发器可以响应服务器级别的事件,如CREATE_DATABASE,而绑定特定数据库时,只能响应与该数据库相关的事件。
触发器主要用于防止或者记录对数据库架构的更改。下面是一个防止非sa用户创建表、绑定所有数据库的触发器。
USE [master] GO create trigger [tr_FanZhiFeiSaChuangJianBiao] on all server --作用于SQL Server实例下所有库 for CREATE_TABLE as --获取事件数据 DECLARE @data XML SET @data = EVENTDATA() --获取用户名 declare @LoginName nvarchar(150) set @LoginName = @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname') --如果用户名不是sa则回滚 if @LoginName<>'sa' begin rollback return end
触发器的语法:
CREATE TRIGGER trigger_name --触发器的名字 ON {database | all server} --确定触发器是绑定特定数据还是所有数据库,database代表绑定特定数据库 {FOR | CREATE_TABLE|CREATE_PROCEDURE } --确定触发器响应事件,可以同时绑定多个,多个时使用‘,’分隔,绑定所有事件使用DDL_SERVER_LEVEL_EVENTS AS sql_statement --你需要编写的SQL语句
--删除绑定所有数据库的触发器 drop trigger trigger_name on all server --删除绑定特定数据库的触发器 drop trigger trigger_name on database
-- 启动绑定特定数据库的触发器 enable trigger trigger_name on database; -- 禁用名绑定特定数据库的触发器 disable trigger trigger_name on database; -- 启动绑定所有数据库的触发器 enable trigger trigger_name on all server; -- 禁用名绑定所有数据库的触发器 disable trigger trigger_name on all server;
--查询绑定特定数据库的触发器 select * from sys.triggers --查询绑定所有数据库的触发器 select * from sys.server_triggers /*触发器不存在于sys.objects 目录视图中,无法对其使用OBJECT_ID 函数*/
在触发器里使用 EVENTDATA()函数,可以获得触发器上下文事件信息。其返回的是一个XML文件,典型内容如下图。
--读取 EVENTDATA()返回的XML DECLARE @data XML SET @data = EVENTDATA() --读取XML节点 DECLARE @dbName nvarchar(250) SET @dbName = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname')
写作时间:2018-10-05
=====================================================================================
本文只代表本人的见解,可能存在错误,仅用于技术交流。如果你喜欢该文,可以扫下面的二维码打赏我(打赏敬请备注“博客园打赏”五字)。
内容总结
以上是互联网集市为您收集整理的SQL Server基础之库级触发器全部内容,希望文章能够帮你解决SQL Server基础之库级触发器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。