当前位置:网站首页>MySQL triggers
MySQL triggers
2022-07-31 00:23:00 【web15286201346】
1. MySQL触发器的概念与作用
触发器概念:触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行.
触发器与存储过程的异同
相同点:1. 触发器是一种特殊的存储过程,触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段.
不同点:2. 存储器调用时需要调用SQL片段,而触发器不需要调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用.
- 在MySQL中,只有执行insert,delete,update操作时才能触发触发器的执行;
- 触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作;
- 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的.现在触发器还只支持行级触发,不支持语句级触发;
触发器的特性:
触发器的作用:
- 安全性.能够基于数据库的值使用户具有操作数据库的某种权利.
能够基于时间限制用户的操作,比如不同意下班后和节假日改动数据库数据.
能够基于数据库中的数据限制用户的操作,比如不同意股票的价格的升幅一次超过10%.
- 审计.能够跟踪用户对数据库的操作.
审计用户操作数据库的语句.
把用户对数据库的更新写入审计表.
- 实现复杂的数据完整性规则
- 实现非标准的数据完整性检查和约束.触发器可产生比规则更为复杂的限制.与规则不同,触发器能够引用列或数据库对象.比如,触发器可回退不论什么企图吃进超过自己保证金的期货.
- 提供可变的缺省值.
- 实现复杂的非标准的数据库相关完整性规则.触发器能够对数据库中相关的表进行连环更新.比如,在auths表author_code列上的删除触发器可导致对应删除在其他表中的与之匹配的行.
在改动或删除时级联改动或删除其他表中的与之匹配的行.
在改动或删除时把其他表中的与之匹配的行设成NULL值.
在改动或删除时把其他表中的与之匹配的行级联设成缺省值.
触发器可以拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务.当插入一个与其主健不匹配的外部键时,这样的触发器会起作用.比如,可以在books.author_code 列上生成一个插入触发器,假设新值与auths.author_code列中的某值不匹配时,插入被回退.
- 同步实时地复制表中的数据.
- 自己主动计算数据值,假设数据的值达到了一定的要求,则进行特定的处理.比如,假设公司的帐号上的资金低于5万元则马上给財务人员发送警告数据.
1.1 创建触发器

create database if not exists mydb01_trigger;
use mydb01_trigger;
-- 用户表
create table if not exists user(
uid int primary key auto_increment,
username varchar(50) not null,
password varchar(50) not null
)default charset=utf8;
-- 用户信息操作日志表
create table if not exists user_logs(
id int primary key auto_increment,
time timestamp,
log_text varchar(100)
)default charset=utf8;
-- 需求1:当user表添加一行数据,则会自动在user_log添加日志记录
-- 定义触发器: trigger_test1
create trigger trigger_test1 after insert on user for each row
insert into user_logs values(NULL,now(),'new');
-- 在user表添加数据,让触发器自动执行
insert into user values(2,'zbb','123456');
1.2 触发器类型NEW和OLD的使用


create database if not exists mydb01_trigger;
use mydb01_trigger;
-- 用户表
create table if not exists user(
uid int primary key auto_increment,
username varchar(50) not null,
password varchar(50) not null
)default charset=utf8;
-- 用户信息操作日志表
create table if not exists user_logs(
id int primary key auto_increment,
time timestamp,
log_text varchar(255)
)default charset=utf8;
-- 需求1:当user表添加一行数据,则会自动在user_log添加日志记录
-- 定义触发器: trigger_test1
create trigger trigger_test1 after insert on user for each row
insert into user_logs values(NULL,now(),'new');
-- 在user表添加数据,让触发器自动执行
insert into user values(3,'zbb','123456');
-- NEW和OLD
-- insert 触发器
-- NEW
-- 定义触发器: trigger_test2
drop trigger trigger_test1
create trigger trigger_test2 after insert on user for each row
insert into user_logs values(NULL,now(),concat('有新用户添加,信息为:',NEW.username,NEW.password));
insert into user values(4,'abb','123456');
-- update 触发器
-- NEW
-- 定义触发器: trigger_test3
-- OLD
drop trigger trigger_test2
create trigger trigger_test3 after update on user for each row
insert into user_logs values(NULL,now(),concat('有用户信息修改,旧数据是:',OLD.uid,OLD.username,OLD.password));
update user set password = '00000' where uid=3;
-- NEW
drop trigger trigger_test3
create trigger trigger_test4 after update on user for each row
insert into user_logs values(NULL,now(),concat('有用户信息修改:新数据是',NEW.uid,NEW.username,NEW.password));
update user set password = '666666' where uid=3;
-- delete类型触发器
-- OLD
create trigger trigger_test5 after delete on user for each row
insert into user_logs values(NULL,now(),concat('有用户被删除,删除信息为:',OLD.uid,OLD.username,OLD.password));
delete from user where uid=3;
参考
https://www.cnblogs.com/mengfanrong/p/3851410.html
https://www.bilibili.com/video/BV1iF411z7Pup=126&spm_id_from=pageDriver
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在.深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小.自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前.因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担.添加下方名片,即可获取全套学习资料哦
边栏推荐
- How to ensure the consistency of database and cache data?
- [Tang Yudi Deep Learning-3D Point Cloud Combat Series] Study Notes
- How to use joiplay emulator
- 【Yugong Series】July 2022 Go Teaching Course 017-IF of Branch Structure
- 【Yugong Series】July 2022 Go Teaching Course 019-For Circular Structure
- Homework: iptables prevent nmap scan and binlog
- firewalld
- Linux 部署mysql 5.7全程跟踪 完整步骤 django部署
- 牛客网刷题训练(四)
- 47. 【Pointers and Arrays】
猜你喜欢
How to ensure the consistency of database and cache data?

Error occurred while trying to proxy request项目突然起不来了

Error ER_NOT_SUPPORTED_AUTH_MODE Client does not support authentication protocol requested by serv

Niuke.com question brushing training (4)

什么是Promise?Promise的原理是什么?Promise怎么用?
![[In-depth and easy-to-follow FPGA learning 14----------Test case design 2]](/img/c0/1130111c90b1bc175b088894c1c18f.png)
[In-depth and easy-to-follow FPGA learning 14----------Test case design 2]

WEB安全基础 - - -漏洞扫描器

Regular expression password policy and regular backtracking mechanism bypass

Error ER_NOT_SUPPORTED_AUTH_MODE Client does not support authentication protocol requested by serv

数据库的严格模式
随机推荐
Jmeter parameter transfer method (token transfer, interface association, etc.)
Ukraine's foreign ministry: wu was restored to complete the export of food security
xss的绕过
MySQL数据库面试题总结(2022最新版)
MySQL的grant语句
MySQL Series 1: Account Management and Engine
网络常用的状态码
WebServer process explanation (registration module)
乌克兰外交部:乌已完成恢复粮食安全出口的必要准备
xss绕过:prompt(1)
Game mall table establishment
In-depth understanding of the auto-increment operator from two error-prone written test questions
从两个易错的笔试题深入理解自增运算符
joiplay模拟器如何使用
Method for deduplication of object collection
unity2D横版游戏教程4-物品收集以及物理材质
PHP图片添加文字水印
【愚公系列】2022年07月 Go教学课程 016-运算符之逻辑运算符和其他运算符
Restricted character bypass
[Tang Yudi Deep Learning-3D Point Cloud Combat Series] Study Notes