数据库基础:触发器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Michaeles/article/details/86594109

一、触发器

1.什么是触发器?

(1)触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,常用来同步更新数据,使用触发器可以更高效的维护数据;

(2)特点:触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行;

(3)作用:保证数据的完整性,起到约束的作用;

2.创建触发器(建立触发器时就要指定该触发器的用途)

(1)语法规则:

create trigger 触发器名称(你自己命名的) on 表 for 用途(delete|update|insert) 
as 
delete|update|insert语句

(2)意思是:在tab_1表上,建立触发器(tri_A),用于删除该表的数据时触发一个事务,什么事务呢?——删除tab_2中的该编号人员的记录。 

create trigger tri_A on tab_1 FOR DELETE 
AS 
delete tab_2 from deleted where tab_2.id = deleted.id; 

3.触发器的应用场景?

(1)安全性

  # 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。

  # 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。

(2)审计

  # 审计用户操作数据库的语句。

  # 把用户对数据库的更新写入审计表。

(3)同步实时地复制表中的数据。

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

(5)触发器可以对数据库中相关的表进行连环更新。例如,在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。

 # 在修改或删除时级联修改或删除其它表中的与之匹配的行。

  # 在修改或删除时把其它表中的与之匹配的行设成NULL值。

  # 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。

  # 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起作用。例如,可以在books.author_code 列上生成一个插入触发器,如果新值与auths.author_code列中的某值不匹配时,插入被回退。

二、代码实战(基于mysql)

//创建user表

1.创建对user表操作历史表;

DROP TABLE IF EXISTS `user_history`;
CREATE TABLE `user_history` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `operatetype` varchar(200) NOT NULL,
  `operatetime` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.创建user表插入事件对应的触发器tri_insert_user;

DROP TRIGGER IF EXISTS `tri_insert_user`;
DELIMITER ;;
CREATE TRIGGER `tri_insert_user` AFTER INSERT ON `user` FOR EACH ROW 
begin
    INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (new.id, 'add a user',  now());
end
;;
DELIMITER ;

//当向user表插入数据时,会自动同步到user_history表

https://blog.csdn.net/LiJianbo_Jon/article/details/79600056

猜你喜欢

转载自blog.csdn.net/Michaeles/article/details/86594109