| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Hello MySQL(十一)——触发器 -> 正文阅读 |
|
[大数据]Hello MySQL(十一)——触发器 |
一、触发器简介1、触发器简介触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力。 2、触发器的优点A、安全性 可以基于数据库的值使用户具有操作数据库的某种权利。可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据;可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。 B、审计 可以跟踪用户对数据库的操作。???审计用户操作数据库的语句;把用户对数据库的更新写入审计表。 C、实现复杂的数据完整性规则 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。提供可变的缺省值。 D、实现复杂的非标准的数据库相关完整性规则。 触发器可以对数据库中相关的表进行连环更新。 ??# 在修改或删除时级联修改或删除其它表中的与之匹配的行。 ??# 在修改或删除时把其它表中的与之匹配的行设成NULL值。 ??# 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。 ??# 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。 E、同步实时地复制表中的数据。 F、SQL触发器提供了运行计划任务 3、触发器的限制A、触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序,也就是存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。 B、不能在触发器中使用以显示或隐式方式开始或结束事务的语句,如START TRANS-ACTION,COMMIT或ROLLBACK。 二、触发器的使用1、创建触发器创建触发器的语法:
trigger_name:触发器的名称。 tirgger_time:触发时机,为BEFORE或者AFTER。 trigger_event:触发事件,为INSERT、DELETE或者UPDATE。 tb_name:表示建立触发器的表名,在哪张表上建立触发器。 trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句。 FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器。 LOAD DATA 语句用于将一个文件装入到一个数据表中,相当与一系列的 INSERT操作。 REPLACE语句一般来说和INSERT语句很像,只是在表中有primary key或 unique索引时,如果插入的数据和原来primary key或unique索引一致时,会先删除原来的数据,然后增加一条新数据。 INSERT型触发器:插入某一行时激活触发器,通过 INSERT、LOAD DATA、REPLACE语句触发; 变量声明:
?对变量赋值采用SET 语句,语法为:
MySQL中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。 2、删除触发器
schema_name是数据库的名称,是可选的。如果省略了schema,将从当前数据库中舍弃触发程序。trigger_name是要删除的触发器的名称。 3、触发器信息查看在MySQL中,所有的触发器的定义都存在于INFORMATION_SCHEMA数据库的triggers表中,可以通过查询命令SELECT来查看,具体语法如下:
?4、触发器的执行顺序InnoDB数据库,若SQL语句或触发器执行失败,MySQL会回滚事务,有: A、如果BEFORE触发器执行失败,SQL无法正确执行。 MySQL的触发器是按照BEFORE触发器、行操作、AFTER触发器的顺序执行的,其中任何一步发生错误都不会继续执行剩下的操作,如果对事务表进行的操作,如果出现错误,那么将会被回滚,如果对非事务表进行操作,那么就无法回滚,数据可能会出错。 三、触发器应用1、实现业务逻辑客户下订单订购商品,商品表自动减少数量。 在商品表创建删除触发器,删除某商品,自动删除该商品的订单。 创建产品表,有产品编号,产品名称、产品数量和产品价格四列,其中产品编号自增长列,并设置成主键。
创建订单表,有三列,订单编号、产品编号和数量,其中订单编号自增长列,并设置成主键。
插入三种产品,产品名称和数量以及价格。
?在订单表上创建触发器,当有订单,会根据订单的产品编号和数量自动减少产品的数量。触发器中NEW代表一个表,存放插入的订单记录。
插入两个订单
查看产品表,可以看到对应的产品数量减少。操作由订单表的Insert触发器完成。 ?在订单表上创建新的触发器,当订单定的某产品产品数量大于产品库存,禁止下订单,也就是禁止在订单表中插入记录。 一张表中只能有一个INSERT类型的触发器,先删除INSERT触发器。
MySQL不能在触发器中通过回滚事务取消操作,但如果触发器的SQL语句执行过程中出现错误,会自动撤销操作,曲线实现事务回滚。
插入订单,看看如果库存不够是否还能够插入成功。
2、实现安全A、限制插入记录的日期 在订单表上创建插入触发器,周六周日不允许下订单。
验证上面创建的触发器是否工作正常,看看当前时间是否是周六周日,向订单表插入记录,检查是否能够成功。
B、限制数据更改的范围 在产品表上创建更新触发器,限制产品价格一次上调不能超过20%。 触发器设置成before update,在更改前检查价格增长幅度是否超过20%,如果超过就产生错误,取消操作。 更新操作分为两步,第一步是删除原来的记录,第二步是插入新记录。原来的记录在old表中,新记录在new表中。触发器中new.price存放的是新价格,old.price是原来的价格。
验证触发器
3、实现数据完整性使用触发器可以限制表插入某列的数值范围。 创建一个学生表,有四列,姓名、性别、手机和邮箱。
A、指定性别列的取值范围 创建触发器,限制性别列,只允许输入“男”和“女”。before insert触发器,不满足条件执行有错误的SQL语句,退出。
验证触发器
B、限制手机列的取值类型和长度 创建触发器,只允许phone列输入的手机号只能是11位数字,且第一位数字是1。
验证触发器,如果手机列插入的值位数不对或者第一位不是1,插入都将失败。
4、使用触发器审计 使用触发器实现对personinfo表数据操作的跟踪,将跟踪事件记录到一张审计表中review。
A、创建触发器记录插入操作
插入personinfo表一条记录
查看review表中增加的INSERT记录
?B、创建触发器记录删除操作
从personinfo删除一条记录
查看reivew表中增加的DELETE记录 ?C、创建触发器记录修改操作
更新personinfo表中名字为‘孙悟空’的phone。
查看reivew表中增加的UPDATE记录 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 10:59:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |