• 执行存储过程报错——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;
  • 相关阅读:
    【连载】【FPGA黑金开发板】Verilog HDL那些事儿VGA(二十)
    【黑金动力社区】【FPGA黑金开发板】Verilog HDL的礼物 Verilog HDL扫盲文
    FPGA黑金开发板勘误
    触发器入门(转)
    SQL Server 索引结构及其使用(三)[转]
    SQL Server 索引结构及其使用(一)(转)
    项目开发管理二(转)
    Ajax在网页中的简单应用
    Ajax简单介绍
    Asp.Net异步数据绑定
  • 原文地址:https://www.cnblogs.com/zjfjava/p/9057779.html
Copyright © 2020-2023  润新知