关于触发器,我想说点什么
今天。。。。。
话不多说,开始正题!!
说到触发器,咱们先说一下,触发器是用来做什么的!
触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。
数据库触发器有以下的作用:
-
安全性。可以基于数据库的值使用户具有操作数据库的某种权利。
-
审计。可以跟踪用户对数据库的操作。
-
实现复杂的数据完整性规则。
-
实现复杂的非标准的数据库相关完整性规则。触发器可以对数据库中相关的表进行连环更新。
-
同步实时地复制表中的数据。
-
自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。
看完上面的介绍,大家都已经对触发器有所了解;再来说说,触发器是怎么使用的。
- 语法(MySQL)
DELIMITER ;; --小编这里用的是两个分号,也可以用其他的不常用的符号;比如:$ CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW --表示每一行的影响都会执行该触发器,不加则表示执行一次事务操作(不管是增删改多少条数据)只会执行一次该触发器 declare --声明变量操作 trigger_stmt DELIMITER ;;
- 语法(Oracle)
create or replace trigger trigger_name before insert or update or delete on salgrade for each row --表示每一行的影响都会执行该触发器,不加则表示执行一次事务操作(不管是增删改多少条数据)只会执行一次该触发器 declare --声明变量操作(变量名在前,类型在后) begin trigger_stmt end trigger_name;
trigger_name:标识触发器名称,用户自行指定。
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER。
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE。
tbl_name:标识建立触发器的表名,那张表的修改会执行该触发器。
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句,多条数据用分号分割。
DELIMITER 的意思就是分号,后面跟的符号表示(第一次出现表示触发器的开始,第二次出现表示触发器的结束;因为在触发器中也会有分号,所以MySQL就用这个符号来表示开始和结束,避免和触发器中的符号冲突)
- new 和 old (:old 和 :new oracle 中)关键字的使用
在 oracle 中使用 :new.列名 或者 :old.列名 获取该列的值,或者给该列赋值;在 MySQL 中 使用 new.列名 或者 old.列名 获取该列的值,或者给该列赋值
在 Oracle 中用 :old
和 :new
表示执行前的行,和执行后的行。在 MySQL 中用 old
和 new
表示执行前和执行后的数据。
在对 new 赋值的时候只能在触发器 before 中只用,在 after 中是不能使用的
insert 时候使用 new
delete 时候用 old
update 时候 new 和 old 都可以用