网站首页 > 技术文章 正文
触发器复杂语法:
create trigger trigger_name on { table | view } [ with encryption ] --用于加密触发器 { { { for | after | instead of } { [ insert ] [ , ] [ update ] } [ with append] [ not for replication] as [ { if update( column ) [ { and | or } update ( column ) ] [ ...n ] | IF ( columns_update ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } }
注:
- 触发器最多可以嵌套 32 层。
- for和after同义。
- delete 触发器不能捕获truncate table 语句
- 触发器中不允许以下 Transact-SQL 语句: alter /create/drop/load database 、disk init/resize、 load log 、reconfigure 、restore database/log 等。
- 触发器也可以根据数据修改前后的表状态,再行采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
SQL Trigger 触发器的分类
1.数据操作语言 (DML) 触发器
DML Trigger 是指触发器在数据库中发生DML事件时所触发的操作。
DML事件即指在表或视图中修改数据的insert、update、delete语句。
DML触发器包含两种触发器:
- after触发器:执行DML事件后触发,只能定义在表上。
- instead of 触发器:不执行DML事件,仅执行触发器本身。
2. 数据定义语言 (DDL) 触发器
DDL Trigger 是指当服务器或数据库中发生DDL事件时所触发的操作。
DDL事件即指在表或索引中的create、alter、drop语句。
3. 登录触发器
登录触发器一般应用在备份登录或注册信息。
DML触发器的实现使用两个逻辑表(虚表):deleted表和inserted表
1.两表位置:
deleted表和inserted表,建立在数据库服务器的内存中。
2.两表权限:
只读权限。
3.表结构:
和触发器所在的数据表的结构一样。
4.表作用:
- deleted表
用于存放你在操作 insert、update、delete语句前,你创建触发器表中数据库。
2. inserted表
用于存放你在操件insert、update、delete语句后,更新的记录。
5.表时效:
当触发器执行完成后,它们也就会被自动删除。
SQL 触发器查看
- 查看单个触发器
exec sp_helptext 'TriggerName'
2.查看所有触发器
select * from sysobjects where xtype='TR'
慎用触发器
- 过多的触发器使得数据逻辑变得复杂
- 数据操作比较隐含,不易进行调整修改
- 触发器的功能逐渐在代码逻辑或事务中替代实现,更符合OOP思想。
触发器应用实例
1.insert trigger
插入数据,不满足要求抛出错误,事务回滚
----trigger constraint --判断 if object_id(N'newtable1Insert',N'tr') is not null drop trigger newtable1Insert go --create insert trigger create trigger newtable1Insert on newtable1 for insert as declare @Cid int select @Cid = newtable1.Cid from newtable1 inner join inserted on newtable1.Cid=inserted.Cid print @Cid if(@Cid>43) begin raiserror('班级编号不能超过40个!',16,8) rollback tran end go insert into newtable1 values (40 , '028班') ---执行
结果:参见创建触发器。
2.update trigger
newtable表插入数据时 Classes表同步插入数据。
use TestSchool if object_id('Tr_Classes','Tr') is not null drop Trigger Tr_Classes go Create trigger Tr_Classes on newtable for update as begin update Classes set Classes.CName =newtable.CName from Classes , newtable where Classes.Cid =newtable.Cid end go
执行更新语句,验证触发器
select * from newtable select * from Classes update newtable set CName='023班' where Cid = 10 select * from newtable select * from Classes
结果展示:
原数据:
更新,触发触发器后结果:
3.delete trigger
如果newtable
use TestSchool if object_id('Tr_Classes_Delete','Tr') is not null drop Trigger Tr_Classes_Delete go Create Trigger Tr_Classes_Delete on newtable for delete as begin delete from Classes where Classes.Cid in(select Cid from deleted ) end
结果:
select * from newtable select * from Classes
原表:
执行删除操作,触发联动删除
delete from newtable where Cid = 15 select * from newtable select * from Classes
结果:
本文部分内容参考网络,如有错误,敬请指正,如有侵权,请联系修改。
猜你喜欢
- 2024-09-23 (二)SQL数据模式、表、索引的建立与删除
- 2024-09-23 当我们输入一条SQL查询语句时,发生了什么?
- 2024-09-23 超详细!SQL语法速成就靠这篇了!(下)
- 2024-09-23 sql语句(sql语句增删改查)
- 2024-09-23 数据库触发器(数据库触发器的创建和使用)
- 2024-09-23 SQL创建触发器(sql创建触发器禁止修改成绩)
- 2024-09-23 MySQL_08_触发器(mysql触发器的使用及语法)
- 2024-09-23 被低估的SQL(被低估的中国半导体龙头)
- 2024-09-23 都2021年了不会还有人不会用SQL吧
- 2024-09-23 Navicat工具中“清空表”与“截断表”区别,望文生义惹的祸
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 573℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 513℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 486℃启用MySQL查询缓存(mysql8.0查询缓存)
- 469℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 449℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 447℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (83)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)