Oracle触发器

最近在做的是一个项目中的某个模块的数据表需要迁移到一个新库里面,遇到了很多问题,也学习了很多东西。其中遇到一个问题是,有一张预警表的数据是实时的,如果直接将数据表和数据导出再导入新库,无法实现数据的实时更新,特此用触发器解决此问题。
最终决定使用Oracle触发器解决:
一:首先介绍一下触发器:
触发器简介
触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。
因此触发器不需要人为的去调用,也不能调用。
然后,触发器的触发条件其实在你定义的时候就已经设定好了。
触发器分类:
1.DML触发器
对数据表进行DML操作(insert,update,delete)时触发的触发器。
分为语句级触发器和行级触发器。
语句级触发器:对表中每行触发一次触发代码。
行级触发器:只触发一次,与语句所影响行数无关。
before触发器:事件发生之前触发。
after触发器:事件发生之后触发。
2.替代触发器
对视图进行操作,只能定义在视图上。
3.系统事件触发器
对数据库实例或某个用户模式进行操作,分为数据库系统触发器,用户触发器。
二:触发器语法
create [or replace] tigger 触发器名 触发时间 触发事件
on 表名
[for each row]
begin
pl/sql语句
end
其中

触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
触发器能实现如下功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
三:实战问题
首先我在原来的数据库写下触发器:
CREATE OR REPLACE TRIGGER REAL_TIME_INSERT
–实时更新test用户下预警表数据(wuranran-20190425)
AFTER INSERT ON JGPT.T_PRO
FOR EACH ROW
BEGIN
INSERT INTO TEST.T_PRO(STK_COM_CODE,PROBLEM_INNER_ID,PROBLEM_ID,N_IN_KIND, N_KIND,N_AMT_DIFF,N_DATA,F_AUDIT_DATE,Y_DEAL_DATE,STATE,DATA_DATE,PRO_TYPE,Y_ORG_CODE) VALUES(:NEW.STK_COM_CODE,:NEW.PROBLEM_INNER_ID,:NEW.PROBLEM_ID,:NEW.N_IN_KIND, :NEW.N_KIND,:NEW.N_AMT_DIFF,:NEW.N_DATA,:NEW.F_AUDIT_DATE,:NEW.Y_DEAL_DATE,:NEW.STATE,:NEW.DATA_DATE,:NEW.PRO_TYPE,:NEW.Y_ORG_CODE);
END;
触发器的含义:就是在当前用户下对这张表进行插入操作时,将插入的数据实时更新到TEST用户下的表t_pro表中。
遇到的问题
触发器报PL/SQL: ORA-00942: 表或视图不存在。
最终发现,在JGPT这个用户下不能对TEST用户进行数据表的相关DML操作,没有权限。
解决的办法
在TEST用户下,使用指令:
grant select,update,insert on test.t_pro to jgpt;
赋予JGPT用户对t_pro的DML操作权限,问题解决。
希望对大家有所帮助!感谢支持!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值