热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer基础之库级触发器

 触发器分为两种,一种与数据表绑定,响应数据表指定动作(insert、delete或update),此处称为表级;一种与数据库本身绑定,响应数据定义(DDL)语句(主要是CREAT

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

 

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


推荐阅读
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • 一、新建登录名1.在登录名右侧的文本框中输入新建的管理员账号名称;2.一对单选按钮组中,选择SqlServer身份验证,并输入登录密码;3.勾选强制实施密码策略复选框;(密码策略一 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 查询zabbix相关数据sql语句笔记
    1、查询zabbix过去一周群组告警总数SELECTa.hostid,a.`host`,a.`status`,a.`name`AShostnname,b.`name`ASgroup ... [详细]
  • ImlearningWPFandIencounteredthefollowingproblem:我正在学习WPF,遇到了以下问题:Ihaveanenumtypein ... [详细]
author-avatar
小李子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有