SQL之trigger触发器
触发器是一种数据库对象,一般与一个表相关联,当对该表做出某种修改操作(INSERT、DELETE、UPDATE)时,它会自动地予以执行。触发器可以查询其它表,并可以包含复杂的SQL(或Transact-SQL)语句。
触发器经常用于加强数据的完整性约束和业务规则等。
由于每个厂商对trigger的实现不同,这里以SQL Server为例。
特点
1)它与表紧密相连,可以看作表定义的一部分
2)它不能通过名称被直接调用,更不允许带参数,而是当用户对表中的数据进行修改时,自动执行
3)它可以用于SQL Server约束、默认值和规则的完整性检查,实施更为复杂的数据完整性约束
一个触发器定义包含以下三个部分(ECA)
(1)事件(Event):激活触发器执行的数据库改变事件,可能是在某个特定表上执行的UPDATE、DELETE、INSERT等操作
(2)条件(Condition):是触发器能够执行必须满足的条件
(3)动作(Action):当触发器被激活且条件为真时,DBMS要执行的过程
SQL Server中trigger的类型
(1)INSERT触发器可以完成对输入数据的审核,用来修改或拒绝接受正在插入的记录
(2)DELETE触发器用于约束用户能够从数据库中删除的数据
(3)UPDATE触发器约束用户对表中数据的update操作
(4)以上几种类型的组合触发器
trigger用途
(1)当某些表修改时,可以读取或修改其他的表或数据库,保证数据库的一致性
(2)比较数据前后版本的不同,提供高级的审计和透明事件记录
(3)自动地生成导出列(通过表达式计算出的列)的值
(4)施行复杂的安全性确认和事务约束
(5)维护同步表
触发器与约束
1.在特殊情况下各有优势。
2.触发器的主要好处在于它们可以包含使用 T-SQL 代码的复杂处理逻辑。
3.在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。
创建trigger
基本格式为:
CREATE TRIGGER trigger_name
ON {table | view}
{FOR | INSTEAD OF} {[INSERT] [,] [UPDATE] [,] [DELETE]}
ASsql_statement [ ...n ] [RETURN]
其中,
1.trigger_name是触发器的名称,同样在数据库中必须唯一。而Table | view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图
2.FOR指定触发器只有在触发SQL语句(INSERT、UPDATE、DELETE)中指定的所有操作都已成功执行后才激发,而且只能在表上定义。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器
3.INSTEAD OF 指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器
4.{ [DELETE] [,] [INSERT] [,] [UPDATE] }是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项
5.sql_statement是触发器的条件和动作。触发器条件指定其它准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。当尝试 DELETE、INSERT 或 UPDATE 操作时,T-SQL语句中指定的触发器操作将生效,对每个语句触发器只执行一次,即使此语句修改了好几行
triggers on Views
正常情况下,我们无法修改一个虚拟的视图,因为这个视图是不存在的,但是我们可以通过触发器来对视图进行修改。
如:首先创建一个视图
CREATE VIEW Synergy
ASSELECT Likes.drinker, Likes.beer, Sells.barFROM Likes, Sells, FrequentsWHERE Likes.drinker = Frequents.drinkerAND Likes.beer = Sells.beerAND Sells.bar = Frequents.bar;
然后我们对该视图创建一个触发器
CREATE TRIGGER ViewTrig
ON Synergy
INSTEAD OF INSERT
ASINSERT INTO Likes SELECT drinker, beer FROM INSERTED;INSERT INTO Sells(bar, beer) SELECT bar, beer FROM INSERTED;INSERT INTO Frequents SELECT drinker, bar FROM INSERTED;
创建完以后,我们就可以对视图进行INSERT操作
INSERT INTO Synergy VALUES('Tom', '科罗娜', '3DArtBar');
删除trigger
DROP TRIGGER { 触发器名称 } [ ,...n ]
当某个表被删除后,该表上的所有触发器将同时被删除,但是删除触发器不会对表中的数据有影响。
trigger应用实例
准备数据
create table student(sno char(5) primary key,sname char(8) not null,age smallint check(age >= 15 and age <= 35),sex nchar(1) check(sex = '男' or sex = '女')
)
create table course(cno char(4) primary key,cname char(20) not null,teacher char(8)
)
create table study(sno char(5) foreign key references student(sno),cno char(4) foreign key references course(cno),score smallint,primary key(sno, cno)
)
应用
1.为study表创建一个UPDATE触发器,当更新成绩时,要求更新后的成绩不能低于原来的成绩。
create trigger update_score
on study
instead of update
asdeclare @sno char(5), @cno char(4), @score1 smallint, @score2 smallintselect @sno = sno, @cno = cno, @score1 = score from insertedselect @score2 = scorefrom deletedif(@score1 >= @score2)update study set score = @score1where study.cno = @cno and study.sno = @sno;
go --批处理的标志,把程序分为一个个代码块,每个被go分隔的语句都是独立的事务
update study
set score = 80
where sno = '98601' and cno = 'C601'; --因为更新的分数小于原分数,所以更新失败
2.为study表创建一个DELETE触发器,要求一次只能从study表中删除一条记录。
create trigger del_one
on study
instead of delete
asdeclare @num int, @sno char(5), @cno char(4)select @num = count(*) from deletedif @num = 1begin select @sno = sno, @cno = cno from deleteddelete from study where @sno = study.sno and @cno = study.cnoendelse print'要删除的记录多于1条';
go
delete from study
where sno = '98601'; --因为删除多条记录,所以输出打印信息'要删除的记录多于1条'
3.为course表创建一个INSERT触发器,要求插入的课程记录中任课教师不能为空。
create trigger insert_course on course
instead of insert
asdeclare @cno char(4), @cname char(20), @teacher char(8)select @teacher = teacher from insertedif(@teacher is null) print'教师名不能为空';else beginselect @cno = cno, @cname = cname from insertedinsert into course values(@cno, @cname, @teacher)end;
go
insert into course(cno, cname) values('C606', '计算机组成原理');
SQL之trigger触发器相关推荐
- PL/SQL -- INSTEAD OF 触发器
为什么80%的码农都做不了架构师?>>> --============================== -- PL/SQL --> INSTEAD OF 触发器 -- ...
- 详解SQL中的触发器
● 原因 ● 触发器 ○ 简介 ○ 分类 ○ INSERTED和DELETED ○ 优缺点 ● 语法 ○ 建立触发器 ○ 删除触发器 ○ 修改触发器 ○ 开启和禁用 ○ 提醒和保护 ● 示例 原因 今 ...
- Mysql使用trigger触发器说明
由于项目中需要使用到触发器个人就开始简单的了解了一下.但是过程中遇到了几个问题,在此记录一下. 前三步先把效果展示出来,后面会对trigger做详细的描述 第一步:创建测试表 CREATE TABLE ...
- 如何使用SQL Server INSTEAD-OF触发器
如何使用SQL Server INSTEAD-OF触发器 触发器是类似于存储程序的数据库对象,它响应数据库环境下的某个请求.SQL Sever 2005包含3个触发器对象:AFTER,数据定义语言 ( ...
- 实验9 SQL Server 的触发器
实验9 SQL Server 的触发器 一.实验目的 1.了解触发器的触发过程和类型 2.通过执行SQL脚本,掌握创建触发器并测试触发器 3.掌握通过使用触发器维护数据完整性的方法. 二.实验要求 1 ...
- SQL Server:触发器详解
SQL Server:触发器详解 1. 概述 2. 触发器的分类 3. Inserted和Deleted表 4. 触发器的执行过程 5. 创建触发器 6. 修改触发器: 7. 删除触发器: 8. 查看 ...
- MS SQL SERVER2005更新触发器
MS SQL SERVER2005更新触发器 为记录表test1中T01字段由'0'更新为'1'的发生时间,增加UPDATE触发器. SET ANSI_NULLS ON GO SET QUOTED_I ...
- 数据库mysql进阶—trigger触发器
触发器 在实际开发中,我们经常会遇到这样的情况:有两个或者多个相互关联的表,如商品信息和库存信息分别存放在2个不同的数据表中,我们在添加一条新的商品记录的时候,为了保证数据的完整性,必须同时在库存表中 ...
- 解决 报错ora-04098: oracle trigger 触发器无效且未通过重新验证
解决 报错ora-04098: oracle trigger 触发器无效且未通过重新验证 在开发过程中 本人遇到以下报错信息: 1. 2. [SQL]select TB_REPORT_KIND_id. ...
最新文章
- mysql 查询缓存
- 东北全面放开生育,数据揭秘人口和GDP和房价间联系
- Ubuntu开发之旅一---安装初步
- swift基础学习(八)
- 与时间相关的java源码_Java 基于当前时间获取和计算时间
- MySql应用原理分析系列文章目录
- Open Live Writer - TargetInvocationException
- 猎洞20年老兵的经验之谈
- 仪表自定义刻度值_汇总丨工业仪表知识大全和选型参考
- 2021年PMP考试模拟题7(含答案解析)
- 小米wifi 苹果驱动安装教程macOS Mojave 10.14,Sierra 10.12测试通过
- Maxwell 是什么?
- Ragel-基于有限状态机用于产生源码的编译器
- 参数曲面matlab,MATLAB空间曲面的实现方法
- ❤️❤️新生代农民工熬夜整理Python入门教程,包教包会!附源码❤️❤️
- 毕业论文使用Endnote技巧(设置引用格式为国标、参考文献排列顺序)
- 无法远程连接到计算机 凭证,远程连接凭据不工作如何处理_远程桌面连接提示凭据无法工作的解决教程-win7之家...
- IKexpression解读三
- 还用 Macbook 装Windows ?你就out了
- 2022“杭电杯”中国大学生算法设计超级联赛(8)
热门文章
- Tomcat 10 调用Servlet提示 500 实例化Servlet类异常
- 网易蓝牙耳机怎么切换双耳_单双切换,自动秒连,真正的无感操作——360无线蓝牙耳机测评...
- 功能测试和自动化测试的优缺点
- WinMerge比较时未显示出全部文件
- c++语言小游戏源码,跪求小游戏c++代码
- Windows XP实用技巧44条
- Mysql性能优化及主从同步-mysql-xing-neng-you-hua-ji-zhu-cong-tong-bu
- EDVR复现过程中的Segmentation Fault及Vimeo-90k数据集的百度盘下载
- 帝国Cms列表页和内容页调用栏目名称与链接标签的说明(列表与标签模板)
- 从Domino公式@DBLookup Web化谈如何实现通用函数