触发器:在数据库记录发生新增、修改、删除前后触发
如何:合同中,金额=单价*数量
利用触发器实现,先拿到提交数据中的单价和数量,获取数据库表中的金额字段,将数量*单价的结果刚入到金额字段,new\old前缀就能访问其数据。触发器处理完成,提交,数据被写入到数据库表中。(类似拦截器)
触发器编写步骤:
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‘)
但是,无论是触发器还是存储过程,都有一个致命的缺点:依赖数据库底层
所以,现今企业轻数据库应用,重程序应用,将大量代码都放在代码端。
原文:http://www.cnblogs.com/yolanda-lee/p/5493106.html