• 执行存储过程报错——ora-01031:权限不足


    1. 执行DDL报错

    在oracle存储过程中,默认是可以直接执行DML和DQL的,但是执行CREATE这种的DDL则需要借助EXECUTE IMMEDIATE ···了,如下备份表语句

      --抄表表备份
      SELECT TO_CHAR(SYSDATE,'YYMMDD') INTO V_DQRQ FROM DUAL;
      V_CREATESQL := 'CREATE TABLE SF_EBZCB'||V_DQRQ||'_T AS SELECT * FROM SF_EBZCB_T'; 
      EXECUTE IMMEDIATE V_CREATESQL;

    当执行该语句时,提示 ORA-01031: 权限不足。该用户已赋予DBA权限。

    原因:CREATE TABLE想使用CREATE ANY TABLE权限,而CREATE ANY TABLE权限来自DBA角色,默认情况下,虽然在会话环境中可见,但在存储过程中不可见(无效)。

    即:ORACLE默认为定义者权限,定义者权限在存储过程中ROLE无效,需要显式授权。

    GRANT CREATE ANY TABLE TO charge_liny;

    执行上面sql显式授权后,在该用户下通过 EXECUTE IMMEDIATE 执行CREATE语句即可成功创建表。

    2. 授权当前用户查询其他用户下的表

    查询另一用户下的中间库某表中的数据并更新到当前用户中的某个表中,当调用其他用户的表时,需要使用 用户.表名 的格式来区分该表是否是当前用户下的表,这里也需要在被调用的用户下显式的授权给当前用户查询权限。

    INSERT INTO SF_EBZCB_T
      (YHBH, CNQ, JLBBH, SCBS, BCBS, YL, JSYL)
      SELECT YHBH, CNQ, RBXH, QCBL, JZBL, BJYL, SJYL
        FROM USER_INFO.RB_INFO 
    WHERE SYNCSTATE = 0 AND CNQ = SF_DQCNQ_F;

    授权语句(在USER_INFO用户下)

    GRANT SELECT ANY TABLE TO CHARGE_LINY;

    授权其他DML权限

    GRANT INSERT ANY TABLE TO CHARGE_LINY;
    GRANT UPDATE ANY TABLE TO CHARGE_LINY;
    GRANT DELETE ANY TABLE TO CHARGE_LINY;
  • 相关阅读:
    安卓长按应用图标弹出快捷方式(shortcut)
    网站主题变暗黑,快速解决
    android 11适配的其他注意点
    vue cli3.0构建多页面应用
    Alibaba Canal config 漏洞验证
    检测magiskhide
    Flutter垃圾回收器
    UIbutton 在动画过程中也能响应事件,主要利用layer的hitTest方法
    CocoaPods 私有化
    Android WorkManager使用入门
  • 原文地址:https://www.cnblogs.com/zjfjava/p/9057779.html
Copyright © 2020-2023  润新知