• 详解MariaDB数据库的触发器


    1.什么是触发器

    触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行
    它比数据库本身标准的功能有更精细和更复杂的数据控制能力
    

    2.触发器的作用:

    2.1 安全性

    可以基于数据库的值使用户具有操作数据库的某种权利。
    可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据
    可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%
    

    2.2 审计

    可以跟踪用户对数据库的操作
    审计用户操作数据库的语句
    把用户对数据库的操作写入审计表
    

    2.3 实现复杂的数据完整性规则

    实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。
    例如,触发器可回退任何企图吃进超过自己保证金的期货。
    

    2.4 实现复杂的非标准的数据库相关完整性规则。

    触发器可以对数据库中相关的表进行连环更新。
    例如,在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。
    	触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务
    

    2.5 实时同步地复制表中的数据

    2.6 自动计算数据值

    如果数据的值达到了一定的要求,则进行特定的处理。
    例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据
    

    3.创建触发器:

    语法:

    create trigger 触发器名称 触发的时机 触发的动作 on 表名 for each row 触发器状态。
    

    参数说明:

    触发器名称:  自己定义
    触发的时机: before /after表示在执行动作之前还是之后触发操作
    触发的动作 :指的激发触发程序的语句类型<insert ,update,delete>
    触发器创建语法四要素:
    	1.监视地点(table) 
    	2.监视事件(insert/update/delete) 
    	3.触发时间(after/before) 
    

    例子:当category表中,删除一个bTypeid=3的图书分类时,books表中也要删除对应分类的图书信息

    mysql> use book;
    	在category执行删除前,查看bTypeId=3的图书分类:
    mysql> select bName,bTypeId from books where bTypeId=3;
    	
    创建触发
    	mysql> delimiter //
    mysql> create trigger delCategory after delete on category for each row
        -> delete from books where bTypeId=3;
        -> //
    删除bTypeId=3的记录
    mysql> delete from category where bTypeId=3;
    查看:是否还有bTypeId=3的图书记录。可以看出已经删除。
    
    
    MariaDB [book]> select bName,bTypeId from books where bTypeId=3;	# 查询books表中bTypeId为3的记录
    +--------------------------------------+---------+
    | bName                                | bTypeId |
    +--------------------------------------+---------+
    | 3D MAX 3.0 创作效果百例              | 3       |
    | 3DS MAX 4横空出世                    | 3       |
    | 3D MAX R3动画制作与培训教程          | 3       |
    | 3D Studio Max 3综合使用              | 3       |
    +--------------------------------------+---------+
    4 rows in set (0.00 sec)
    
    MariaDB [book]> delimiter //
    MariaDB [book]> create trigger del_category after delete on category for each row		# 创建触发器,当从category中删除记录中触发
        -> delete from books where bTypeId=3;		# 触发后的操作:从books表中删除bTypeId为3的记录
        -> //
    Query OK, 0 rows affected (0.02 sec)
    
    MariaDB [book]> delete from category where bTypeId = 3//	# 在category表中删除bTypeId为3的记录
    Query OK, 1 row affected (0.01 sec)
    
    MariaDB [book]> select * from category where bTypeId =3//	# 查询category表中bTypeId为3的记录
    Empty set (0.01 sec)
    
    MariaDB [book]> select * from books where bTypeId =3//		# 查询books表中bTypeId为3的记录
    Empty set (0.00 sec)
    

    4.查看触发器:

    4.1 查看创建过程

    语法:

    show create trigger 触发器名字G
    

    例子:

    MariaDB [book]> show create trigger del_categoryG			# 查看前面创建的触发器del_category
    *************************** 1. row ***************************
                   Trigger: del_category
                  sql_mode: 
    SQL Original Statement: CREATE DEFINER=`root`@`localhost` trigger del_category after delete on category for each row
    delete from books where bTypeId=3
      character_set_client: utf8
      collation_connection: utf8_unicode_ci
        Database Collation: utf8_general_ci
    1 row in set (0.00 sec)
    

    4.2 查看触发器详细信息

    语法:

    show triggersG   # 查看所有的触发器
    

    例子:

    MariaDB [book]> show triggers G
    *************************** 1. row ***************************
                 Trigger: del_category
                   Event: DELETE
                   Table: category
               Statement: delete from books where bTypeId=3
                  Timing: AFTER
                 Created: NULL
                sql_mode: 
                 Definer: root@localhost
    character_set_client: utf8
    collation_connection: utf8_unicode_ci
      Database Collation: utf8_general_ci
    1 row in set (0.00 sec)
    

    5.删除触发器:

    语法:

    drop trigger 触发器名称;
    

    例子:

    MariaDB [book]> delimiter;
    
    MariaDB [book]> drop trigger del_category;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [book]> delimiter;
  • 相关阅读:
    存在和本质
    数据库的日志机制
    【msql】关于redo 和 undo log
    乐观锁是基于比较的无锁并发控制机制
    两段锁协议和防止死锁的一次封锁法
    并发编程沉思录
    什么是B-Tree
    二叉树与b树的性能区别:计算、层级与io
    认知模型
    复杂性、认知与心理学
  • 原文地址:https://www.cnblogs.com/renpingsheng/p/9603973.html
Copyright © 2020-2023  润新知