SQL Server基础之库级触发器

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

  触发器(又名ddl触发器)是一段有特定语法,实现一定功能的sql语句,它与数据库本身绑定,当数据发生指定动作(主要是createalter 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

 

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

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐