SQL Server基础之库级触发器

触发器分为两种,一种与数据表绑定,响应数据表指定动作(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

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

原文地址:https://www.cnblogs.com/j20171203/p/9744456.html

时间: 2024-10-10 08:48:54

SQL Server基础之库级触发器的相关文章

SQL Server基础之登陆触发器

虽然同表级(DML)触发器和库级(DDL)触发器共顶着一个帽子,但登陆触发器与二者有本质区别.无论表级还是库级,都是用来进行数据管理的,而登陆触发器是纯粹的安全工具. 登陆触发器只响应LOGON事件,在登陆数据库成功后.用户会话未实际建立前触发.登陆数据库失败,如账号密码错误,不会激发登陆触发器.登陆触发器内部的错误消息及PRINT等SQL语句输出信息,统一写到SQL Server 错误日志.登陆触发器可以同时存在多个,但存在多个时,SQL Server不保证所有触发器的执行顺序,只能使用sp_

SQL Server -为代码减负之触发器

触发器是一张表的增删改操作,引起或触发对另一张表的增删改操作,所以触发器便有3种类型,分别是deleted触发器,Update触发器,insert触发器 触发器又根据替换原来的增删改操作,还是在原来的增删改完成之后进行增删改操作,分为Instead of触发器和For或者After触发器(for和after属于一种触发器) 触发器的使用涉及到两张非常重要的表用来保存已经改变或者已经在第一章被操作的表上不存在的记录,分别是虚拟表Inserted和虚拟表Deleted 虚拟表Inserted 虚拟表

SQL Server基础知识

查看sql server版本 select @@VERSION 基本操作 use tty; 使用tty数据库 create table tt(name varchar(10)); 新建表tt insert into tt values('ftp'); 插入数据ftp select * from tt; 查看表tt delete from tt; 删除表表tt中的一条记录 运行命令的快捷方式: Alt+x 重启数据库服务 net restart mssqlserver 修改用户密码 企业管理器——

SQL Server基础

一.常用命令 1.使用命令行开启SQL Server服务 获取管理员权限的命令行工具: net start mssqlserver 开启sql server服务 net restart mssqlserver 重新启动sql server服务 net stop mssqlserver 关闭sql server服务 2.使用命令登陆(该方法可适用于在一台没有SQL Server的电脑去操作一台有SQL Server的电脑) 运行: sqpl ?/ [-S 服务器的名称]  [-U 登陆名] [-P

SQL Server 基础 03 查询数据基础

查询数据 简单的查询 1 create table stu_info 2 ( 3 sno int not null 4 ,sname varchar(20) not null 5 ,sex varchar(2) not null 6 ,birth varchar(20) not null 7 ,email varchar(20) not null 8 ,telephone int not null 9 ,depart varchar(20) not null 10 ) 11 12 13 sele

MS Sql Server 中主从库的配置和使用介绍(转)

网站规模到了一定程度之后,该分的也分了,该优化的也做了优化,但是还是不能满足业务上对性能的要求:这时候我们可以考虑使用主从库. 主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的查询操作:从库负责查询较旧数据,做一些对实效性要求较小的分析,报表生成的工作.这样做将数据库的压力分担到两台服务器上从而保证整个系统响应的及时性. SQL Server提供了复制机制来帮我们实现主从库的机制.我们看下如何在sql server 2005中实践: 实践前需要新创建一个Test的数据库

SQL server基础知识(表操作、数据约束、多表链接查询)

SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database 数据库名称 查询:select name from master..sysdatabases 修改:alter database 数据库名称(在 sql server 中修改与数据库关联的文件和文件组.在数据库中添加或删除文件和文件组.更改数据库或其文件和文件组的属性) (3).管理表 选择数据库:use 数

SQL Server 基础 04 函数与分组查询数据

函数与分组查询数据 系统函数分 聚合函数.数据类型转换函数.日期函数.数学函数 . . . 1. 聚合函数 主要是对一组值进行计算,然后返回一个值. 聚合函数包括 sum(求和).avg(求平均值).min().max().count(求数量) sum函数语法  :  sum(列明) select sum(sno) as 序号和 from stu_info avg select avg(sno) as 序号平均值 from stu_info . . . count 用来一组值的个数,统计 sel

SQL Server 中 ROWLOCK 行级锁

一.ROWLOCK的使用 1.ROWLOCK行级锁确保,在用户取得被更新的行,到该行进行更新,这段时间内不被其它用户所修改.因而行级锁即可保证数据的一致性,又能提高数据操作的并发性. 2.ROWLOCK告诉SQL Server只使用行级锁,ROWLOCK语法可以使用在SELECT,UPDATE和DELETE语句中. 3.例如select语句中 A 连接中执行 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ begin tran select * f