关于Oracle存储过程执行权限问题的解决

http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html

(2014-04-02 04:06:28)

  分类: oracle-基础
    今天晚上升级,有个存储过程死活编译不过去,提示权限不足,但是用户是具有dba权限的,网上一查才知道,oracle存储过程分两种,DR(Definer's Rights ) Procedure和IR(Invoker's Rights ) Procedure。

    1、定义者权限:定义者权限PL/SQL程序单元是以这个程序单元拥有者的特权来执行它的,也就是说,任何具有这个PL/SQL程序单元执行权的用户都可 以访问程序中的对象。所有具有执行权的用户都有相同的访问权限,在定义者权限下,执行的用户操作的schema为定义者,所操作的对象是定义者在编译时指 定的对象。在定义者(definer)权限下,当前用户的权限为角色无效情况下所拥有的权限。
    2、调用者权限:调用者权限是指当前用户(而不是程序的创建者)执行PL/SQL程序体的权限。这意味着不同的用户对于某个对象具有的权限很可能是不同 的,这个思想的提出,解决了不同用户更新不同表的方法。在调用者权限下,执行的用户操作的schema为当前用户,所操作的对象是当前模式下的对象。在调 用者(invoker)权限下,当前用户的权限为当前所拥有的权限(含角色)。
    3、ORACLE默认为定义者权限,定义者权限在存储过程中ROLE无效,需要显示授权,例如在存储过程中调用其他用户的表,但是定义存储过程的当前用户没有显示访问该表的权限,即使当前用户具有dba角色,编译过程中也会出现权限不足的问题,因为role无效。

定义存储过程时,通过指定AUTHID 属性,定义DR
Procedure 和IR Procedure

DR Procedure 
1、定 义
    CREATE OR REPLACE
procedure DEMO(ID in NUMBER) AUTHID DEFINER as
     
...
    BEGIN
     
...
    END DEMO;
IR Procedure
1、定 义
    CREATE OR REPLACE
procedure DEMO(ID in NUMBER) AUTHID CURRENT_USER as
   
 ...
    BEGIN
   
 ...
    END DEMO;
 

用存储过程创建数据表:

创建时注意必须添加authid current_user ,如果创建的表已存在,存储过程继续执行,但如不不加此关键语句,存储过程将出现异常,

这个语句相当于赋权限。

 
我的实例:SP1 call SP 2:
1. SP1:
CREATE OR REPLACE Procedure Proc_Update_ID_NO ( v_IN in Varchar2, v_OUT Out Varchar2) AUTHID CURRENT_USER
As

v_sqlerrm VARCHAR2(4000) ;
v_temp_table varchar(30);

Begin

-- DELETE DUPLICATE DATA FROM table CAR.ZCXYXX_SZJSPX,KEEP THE LATEST ONE RECORD.
--CALL SP  Proc_DISTINCT_ZCXYXX_SZJSPX('TEMP_ZCXYXX_SZJSPX')
v_temp_table:='TEMP_ZCXYXX_SZJSPX';

-- Call SP to delete duplicate records      
 Proc_DISTINCT_ZCXYXX_SZJSPX(v_temp_table);
    
 
  MERGE INTO DRIVER_TRAIN_LOG Target USING
  (
        SELECT DISTINCT
               DRIVER_NO               ,--学员流水号
               ID_NO                   ,--身份证明号码
               TRAIN_CAR_CLASS          --申请车型(准驾车型
        FROM  ZCXYXX_SZJSPX
  ) Source
  ON
  (
       Source.DRIVER_NO       = Target.DRIVER_NO     --  AND
      -- Source.TRAIN_CAR_CLASS = Target.TRAIN_CAR_CLASS
  )
  WHEN MATCHED THEN  UPDATE  SET
               Target.ID_NO      = Source.ID_NO ;
               --Target.TRAIN_CAR_CLASS = Source.TRAIN_CAR_CLASS ;

COMMIT;  --1
   
   /* UPDATE TRAIN_CAR_CLASS */
    MERGE INTO ZCXYXX_SZJSPX Target USING
    (
          SELECT DISTINCT
                 ID_NO                   ,--身份证明号码
                 TRAIN_CAR_CLASS          --申请车型(准驾车型
          FROM  DRIVER_TRAIN_LOG
    ) Source
    ON
    (
         Source.ID_NO      = Target.ID_NO
    )
    WHEN MATCHED THEN  UPDATE  SET
                 Target.TRAIN_CAR_CLASS      = Source.TRAIN_CAR_CLASS ;

COMMIT;

EXCEPTION
   WHEN OTHERS THEN
        v_sqlerrm := sqlcode|| SQLERRM|| '存储过程[Proc_Update_ID_NO]执行失败!';
        RAISE_APPLICATION_ERROR(-20003,v_sqlerrm);

ROLLBACK;

v_OUT := v_sqlerrm ;

End Proc_Update_ID_NO;

 
----------------------
SP2:
create or replace procedure Proc_DISTINCT_ZCXYXX_SZJSPX(IN_TABLE_NAME varchar2) AUTHID CURRENT_USER  as
  /*********************************
名称:Proc_DISTINCT_ZCXYXX_SZJSPX
功能描述:创建临时数据存储表

修订记录:
版本号   编辑时间  编辑人  修改描述
1.0.0    2015-9-20  **  1.创建此存储过程
1.0.1    2015-9-21  **  2.修改表名称及变量名称,增加必要注释

存储过程执行权限问题: AUTHID CURRENT_USER

入参出参描述:
IN_TABLE_NAME 要创建的临时表名
**********************************/
      v_tablename varchar2(30);--表名
      v_flag number(10,0);
      v_sqlfalg varchar(200);
      v_create_sql varchar(4000);
begin
      v_flag:=0;
      v_tablename:=UPPER(IN_TABLE_NAME);
      v_sqlfalg:='select count(*) from user_TABLES where table_name='''||v_tablename||'''';
      v_create_sql:='CREATE TABLE '|| v_tablename ||' AS SELECT * from
(  select DRIVER_NO,ID_NO,NAME,TRAIN_CAR_CLASS,ACCEPT_DATE,REGIST_STATUS,OPERATION, rec_update_date,MEMO,
   row_number() over (partition BY ID_NO order by rec_update_date desc) RN from ZCXYXX_SZJSPX WHERE RN=1)' ;
     -- dbms_output.put_line(v_create_sql);
      
      execute immediate v_sqlfalg into v_flag;
      if v_flag=0 then  --如果没有这个表 则去创建
        begin
            -- DELETE DUPLICATE DATA FROM table CAR.ZCXYXX_SZJSPX,KEEP THE LATEST ONE RECORD.
            execute immediate v_create_sql;
            execute immediate 'DROP TABLE ZCXYXX_SZJSPX';
            execute immediate 'ALTER TABLE TEMP_ZCXYXX_SZJSPX rename TO ZCXYXX_SZJSPX';
         end;
       else
         execute immediate 'DROP TABLE TEMP_ZCXYXX_SZJSPX';
            -- DELETE DUPLICATE DATA FROM table CAR.ZCXYXX_SZJSPX,KEEP THE LATEST ONE RECORD.
            execute immediate v_create_sql;
            execute immediate 'DROP TABLE ZCXYXX_SZJSPX';
            execute immediate 'ALTER TABLE TEMP_ZCXYXX_SZJSPX rename TO ZCXYXX_SZJSPX';
      end if;

EXCEPTION
   WHEN OTHERS THEN
        --dbms_output.put_line( SQLCODE|| ' :'|| SQLERRM);
        RAISE_APPLICATION_ERROR(-20003,SQLCODE|| SQLERRM|| '存储过程[Proc_DISTINCT_ZCXYXX_SZJSPX]执行失败');
   ROLLBACK;
end;

 
 
 

Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER的更多相关文章

  1. 在ORACLE存储过程中创建临时表

    在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...

  2. MS SQL动态创建临时表

    开发业务需求,需要对一个表作数据分析,由于数据量较大,而且分析时字段会随条件相应变化而变化. 因此计划先把数据转插入一个临时表,再对临时表的数据进行分析. 问题点是如何动态创建临时表.原先Insus. ...

  3. mysql 存储过程动态拼接sql并执行赋值

    )) BEGIN ## 定义变量 ,) ; ## @表示全局变量 相当于php $ ## 拼接赋值 INTO 必须要用全局变量不然语句会报错 SET @strsql = CONCAT('SELECT ...

  4. Oracle:如何创建一个只有查看权限的用户

    因为工作中测试环境和开发环境是分开的,所以开发有时处理bug时需要连接测试数据库,这样出现一个问题是有些开发会为了验证某些问题任意改动数据库的表和字段,对测试库造成污染.为了能够让开发连接测试环境,同 ...

  5. Oracle 12c 用户创建、角色、权限

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAd4AAADHCAIAAAA4UqVzAAAgAElEQVR4nOy9Z5Bk13UmyN/6vZrlrG

  6. MYSQL中存储过程的创建,调用及语法

    MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...

  7. MySql创建一个存储过程

    MySQL 存储过程是从 MySQL 5.0 新功能.存储过程的长处有一箩筐.只是最基本的还是运行效率和SQL 代码封装. 特别是 SQL 代码封装功能,假设没有存储过程,在外部程序訪问数据库时(比如 ...

  8. 关闭ES动态创建mapping

    使用ES的默认配置会使我们在索引不存在于mapping中的字段时,会自动创建. 这无疑会给我们带来困扰. 在我们不想要某个字段被搜索的时候,我们可以在开始关闭动态创建mapping. 执行如下操作: ...

  9. linux下创建文件的文件权限问题

    今天发现创建文件的权限和自己规定的权限不一致,了解到了权限掩码的问题,这里总结一下. 首先权限掩码umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常我们都 ...

随机推荐

  1. RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)

      RecyclerView 给我们的可以检测滑动事件的接口 只有 一个方法 recyclerview.setOnScrollListener()或者 recyclerview.addOnScroll ...

  2. Goppa code

    上面的公式定义了长度为n的Goppa码[1].n=2^m, 其维度 k≥n- t·m. 最小距离d≥ 2t+1. 存在运行时间与 n·t 成正比的快速译码算法. 从形式上看,右边是分式,相当于线性分组 ...

  3. JS原型的问题Object和Function到底是什么关系

    var F = function(){}; Objcert.prototype.a = function(){}; Function.prototype.b = function(){}; F 既能访 ...

  4. 初识App安全性测试

    目前手机App测试还是以发现bug为主,主要测试流程就是服务器接口测试,客户端功能性覆盖,以及自动化配合的性能,适配,压测等,对于App安全性测试貌似没有系统全面统一的标准和流程,其实安全性bug也可 ...

  5. 在阿里云配置URL的REWRITE模式

    今天买了阿里云的虚拟主机,然后把我的项目上传. 网站首页能够访问,但是点开任何页面,都是提示No input file specified,猜测应该是URL重写没有生效,我在浏览器地址把index.p ...

  6. 无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用。

    在删除northwindcs表时,发生报错,消息 3726,级别 16,状态 1,第 2 行,无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用.此时判断是因为有其他表的外键 ...

  7. 初始Java 第一课程DVD项目

    DVDSet 类: DVD DVD    删除功能 实现DVD借出功能 DVD还回功能

  8. jq获取屏幕高度和宽度(盒子模型)

    $(window).width(); //浏览器可视窗口宽度 $(window).height(); //浏览器可视窗口高度 $(document).width();//body的宽度 $(docum ...

  9. LabVIEW之生产者/消费者模式--队列操作 彭会锋

    LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...

  10. SPSS数据分析—多维偏好分析(MPA)

    之前的主成分分析和因子分析中,收集的变量数据都是连续型数值,但有时会碰到分类数据的情况,我们知道最优尺度变换可以对分类变量进行量化处理,如果将这一方法和主成分分析相结合,就称为了基于最优尺度变换的主成 ...