xiaoweigo 2022-10-12 17:20 采纳率: 100%
浏览 84
已结题

oracle触发器执行失败

oracle数据库 使用触发器监控BK_USER_ACTIVE表的增删改操作并将其记录到trig_sql表中
使用的SQL脚本如下:
1.创建trig_sql表用于记录BK_USER_ACTIVE表的增删改操作

create table trig_sql(
         LT DATE not null primary key,
         SID NUMBER,
         SERIAL#       NUMBER,
         USERNAME       VARCHAR2(30),
         OSUSER    VARCHAR2(64),
         MACHINE       VARCHAR2(32),
         TERMINAL       VARCHAR2(16),
         PROGRAM       VARCHAR2(64),
         SQLTEXT       VARCHAR2(2000),
         STATUS    VARCHAR2(30),
         CLIENT_IP       VARCHAR2(60)
);

2.创建trig_sql索引

create index idx_time on trig_sql (LT);

3.创建触发器pri_test BK_USER_ACTIVE为要监控的表

create or replace trigger pri_test
  after insert or update or delete on BK_USER_ACTIVE for each row
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  IF inserting THEN
    INSERT INTO trig_sql
        select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
               s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
               'INSERT',
              sys_context('userenv','ip_address')
          from v$sql q, v$session s
         where s.audsid=(select userenv('SESSIONID') from dual)
           and s.prev_sql_addr=q.address
           AND s.PREV_HASH_VALUE = q.hash_value;
    COMMIT;
  ELSIF deleting  then
      INSERT INTO trig_sql
           select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
                       s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
                       'DELETE',
                       sys_context('userenv','ip_address')
             from v$sql q, v$session s
            where s.audsid=(select userenv('SESSIONID') from dual)
             and s.prev_sql_addr=q.address
             AND s.PREV_HASH_VALUE = q.hash_value;
    COMMIT;
  ELSIF updating then
    INSERT INTO trig_sql
         select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
                     s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
                     'UPDATE',
                     sys_context('userenv','ip_address')
           from v$sql q, v$session s
          where s.audsid=(select userenv('SESSIONID') from dual)
           and s.prev_sql_addr=q.address
           AND s.PREV_HASH_VALUE = q.hash_value;
    COMMIT;
   END IF;
END;

SQL执行后对BK_USER_ACTIVE执行增删改操作 触发器执行错误信息提示如下图

img


ORA-04098: trigger 'JIZHANG.PRI_TEST' is invalid and failed re-validation
, Time: 0.071000s

用如下SQL脚本查看触发器执行失败详细信息

select * from SYS.USER_ERRORS where NAME = upper('pri_test');

触发器执行失败详细信息

img


PRI_TEST TRIGGER 1 10 25 PL/SQL: ORA-00942: table or view does not exist ERROR 0
PRI_TEST TRIGGER 2 5 5 PL/SQL: SQL Statement ignored ERROR 0

网上调查后,个人认定失败是oracle数据库用户权限问题导致(oracle用户继承自角色的权限不包含存储过程,函数,触发器等特殊对象)
网上方案:需要重新对用户显示赋权(trigger相关)
但在网上并没有找到能解决我问题的具体方案。遂发布问答咨询网友,请不吝赐教!
(所使用脚本皆来源网络,如有版权问题,请及时联系本人~
参考资料:https://www.cnblogs.com/lm970585581/p/9138050.html

  • 写回答

2条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-10-12 19:59
    关注

    做下授权,注意中间要多一个下划线

    grant select on v_$session to JIZHANG;
    grant select on v_$sql to JIZHANG;
    

    这是oracle做的特殊处理,实际上"v$session" 是个public的同义词,真正的视图是带下划线的,在PLSQL块中使用的话,要对原视图做下显式的授权

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月26日
  • 已采纳回答 10月18日
  • 创建了问题 10月12日

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘