zoukankan      html  css  js  c++  java
  • 执行存储过程报错——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;
  • 相关阅读:
    shapely and geos break在distance方法
    linux运维
    【未完待补充】linux 设置So动态库链接路径
    用python建立最简单的web服务器
    nginx + keepalived 双机热备
    nagios监控linux主机监控内存脚本
    linux普通用户权限设置为超级用户权限方法、sudo不用登陆密码
    zato server启动后自动关闭问题解决
    Linux下几种文件传输命令 sz rz sftp scp
    python风味之大杂烩
  • 原文地址:https://www.cnblogs.com/zjfjava/p/9057779.html
Copyright © 2011-2022 走看看