当前位置: 首页 > news >正文

【SQL触发器、事务、锁的概念和应用】

【SQL触发器、事务、锁的概念和应用】

1.触发器

(一)触发器概述
1.触发器的定义

触发器(Trigger)是一种特殊的存储过程,它与表紧密相连,可以是表定义的一部分。当预定义的事件(如用户修改指定表或者视图中的数据)发生时,触发器会自动执行。
触发器基于一个表创建,但是可以对多个表进行操作。因此触发器可以用来对表实施复杂的完整性约束,当触发器保存的数据改变时,触发器被自动激活,从而防止对数据的不正确修改。触发器的优点如下。
(1)触发器自动执行,在对表的数据做了任何修改(如手工输入或者使用程序采集的操作)之后立即激活。
(2)触发器可以通过数据库中的相关表进行层叠更改。这比直接把代码写在前台的做法更安全合理。
(3)触发器可以强制限制,这些限制比用CHECK约束定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。
2.触发器的分类
在SQL Server系统中,按照触发事件的不同,可以把提供的触发器分成两大类型,即DDL触发器和DML触发器。
(1)DML触发器
DML 触发器为特殊类型的存储过程,可在发生数据操作语言(DML)事件时自动生效,以便影响触发器中定义的表或视图。DML事件包括 INSERT、UPDATE或DELETE语句。DML触发器可用于强制业务规则和数据完整性、查询其他表并包括复杂的 Transact-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(如磁盘空间不足),则整个事务自动回滚。
(2)DDL触发器
DDL触发器将激发响应各种数据定义语言(DDL)事件。这些事件主要与以关键字CREATE、ALTER、DROP、GRANT、DENY、REVOKE或UPDATE STATISTICS开头的Transact-SQL语句对应。
(二)创建触发器
1.DML触发器
因为DML触发器是一种特殊的存储过程,所以DML触发器的创建和存储过程的创建方式有很多相似之处,创建DML触发器的基本语法如下。

CREATE TRIGGER trigger_name
ON {table|view}
{{{FOR|AFTER|INSTEAD OF}{[UPDATE [[,][INSERT][,][DELETE] ]ASsql_statement}
}

CREATETRIGGER语句中,主要参数的含义如下。

trigger_name:是要创建的触发器的名称。
table|view:是在其上执行触发器的表或者视图,有时称为触发器表或者触发器视图。可以选择是否指定表或者视图的所有者。
FOR、AFTER、INSTEAD OF:指定触发器触发的时机。
AFTER:指定触发器只有在SQL语句中指定的所有操作都已成功执行后才触发,只有在所有的引用级联操作和约束检查成功完成后,才能执行此触发器。如果仅指定FOR关键字,则AFTER是默认设置。
INSTEAD OF:指定执行触发器而不是执行触发的SQL语句,从而替代触发语句的操作。在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器。
DELETE、INSERT、UPDATE:指定在表或视图上执行哪些语句时将触发触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。
sql_statement:指定触发器执行的Transact-SQL语句。

【例1】 创建一个触发器,当class表中的班级编号变更时,同时更新student表中的相应班级编号信息。

USE grademanager
GO
CREATETRIGGERtrig_班级信息更新
ON class
FOR UPDATE
AS
IF UPDATE(classno) 
BEGIN
UPDATE student SET classno=(SELECT classno FROM inserted) 
WHERE classnoIN(SELECT classno FROM deleted) 
END

【例2】 创建一个触发器,用于在grademanager数据库中删除student表的一个学生信息时,级联删除该学生对应sc表中的成绩信息。
默认时,由于student表和sc表在sno列上存在外键约束,因此不允许直接删除student表中

相关文章:

  • 计算机网络:详解TCP协议(四次握手三次挥手)
  • Free Draft Model!Lookahead Decoding加速大语言模型解码新路径
  • 主机电路安全防护系统哪个厂家做
  • 2025年01月03日美蜥(杭州普瑞兼职)一面
  • 递归下降算法
  • ART 下 Dex 加载流程源码分析 和 通用脱壳点
  • Linux 进程基础(二):操作系统
  • Python:Seaborn 美化图表的技术指南
  • Rockermq的部署与使用(0-1)
  • Lesson 16 A polite request
  • Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows]
  • Java--0基础入门篇
  • 修复笔记:SkyReels-V2 项目中的 torch.cuda.amp.autocast 警告和错误
  • SpringMVC——第三章:获取请求数据
  • C++学习:六个月从基础到就业——C++11/14:lambda表达式
  • 《“昊龙一号”:开启中国航天货运新时代》
  • Cognito
  • QT项目----电子相册(6)----总结
  • C++名称空间
  • 介词:连接名词与句子其他成分的桥梁
  • 心期末后有人传——《钱谦益年谱长编》在钱氏故里首发
  • 特朗普要征100%关税,好莱坞这批境外摄制新片能躲过吗?
  • 马上评|“景区陪爬”能成为新职业吗?
  • 长三角铁路今日预计发送旅客398万人次,客流持续保持高位运行
  • 上音校园春日花艺引路人打卡,阳台音乐会吹响《玫瑰人生》
  • 少数人的奢侈品还是所有人的必需品:我们如何解构创造力?