触发器与存储过程笔记

触发器:在数据库记录发生新增、修改、删除前后触发

如何:合同中,金额=单价*数量

利用触发器实现,先拿到提交数据中的单价和数量,获取数据库表中的金额字段,将数量*单价的结果刚入到金额字段,newold前缀就能访问其数据。触发器处理完成,提交,数据被写入到数据库表中。(类似拦截器)

触发器编写步骤:

create trigger 触发器名称

触发时机(before/after) 触发条件(insert/update/delete)

on 数据库表/视图/用户模式/数据库(操作的数据库表、视图等)

for each row(行级触发器)

begin 

  触发器主体功能

end

触发器例子一:删除合同记录前先删除这条合同里的货物记录

create trigger tri_delete

before delete

on 'jkdb'.'contract_c'

for each row

begin 

  delete from contract_product_c where contract_id = old.contract_id

end

触发器例子二:记录对dept表的操作记录日志

create or replace trigger tri_dept

before insert or update or delete

on dept

declare 

   var_tag varchar2(10);                //声明变量,存储对dept表执行的操作类型

begin

  if inserting then                    //当前触发的事件是insert时

    var_tag := '插入';                  //标识插入操作

  elsif updating then

    var_tag :='修改';

  elsif deleting then

    var_tag :='删除';

  end if;

  insert into dept_log values(var_tag,sysdate);      //向日志表中插入对dept表的操作信息

end

end tri_dept;

使用触发器优点:速度极快,代码维护方便

缺点:不能控制事务。

存储过程:

DELIMITER $$

USE `jkdb`$$

DROP PROCEDURE IF EXISTS `sp_del_contract`$$

/*IN输入参数标识*/

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_del_contract`(IN p_contract_id VARCHAR(40))

BEGIN

/*删除指定货物下的附件信息*/

DELETE FROM ext_cproduct_c WHERE contract_product_id IN (SELECT contract_product_id FROM contract_product_c WHERE contract_id=p_contract_id);

/*删除指定合同下的货物信息*/

DELETE FROM contract_product_c WHERE contract_id=p_contract_id;

/*删除指定的合同*/

DELETE FROM contract_c WHERE contract_id=p_contract_id; 

COMMIT;

END$$

DELIMITER ;

MyBatis调用存储过程:(基于Mysql数据库)

 数据库查询调用

CALL sp_del_contract('4028817a3357462e01336cc0877b0010')

但是,无论是触发器还是存储过程,都有一个致命的缺点:依赖数据库底层

所以,现今企业轻数据库应用,重程序应用,将大量代码都放在代码端。

原文地址:https://www.cnblogs.com/yolanda-lee/p/5493106.html