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

原文地址:http://blog.itpub.net/4227/viewspace-69049/

今天晚上升级,有个存储过程死活编译不过去,提示权限不足,但是用户是具有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;

时间: 2024-11-07 06:31:27

【转】关于Oracle存储过程执行权限问题的解决的相关文章

oracle 存储过程执行可输入sql语句并返回结果集

1.建立测试表: create table AAA ( aa NVARCHAR2(100), bb NVARCHAR2(100), cc NVARCHAR2(100), dd NVARCHAR2(100) ) 并导入测试数据insert into aaa values('1','1','1','1'); 2.测试可行性: DECLARE v_cursor NUMBER; v_stat NUMBER; aa VARCHAR(100); bb VARCHAR(100); cc VARCHAR(100

oracle存储过程执行中输出日志文件

create or replace procedure p_outputdebug(a varchar2,b varchar2,c varchar2)is vFileName varchar2(100); OutputFile UTL_FILE.FILE_TYPE;begin select 'rfid_'||a.rfid||'.log' into vFileName from tbl_animal_info a where a.rfid='330100000078176' ; OutputFil

使用mybatis执行oracle存储过程

存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验. 1.无输入和输出参数的存储过程,我写了一个比较简单的,需要注意的是Oracle无参存储过程不能写括号 CREATE OR REPLACE Procedure cascadeoperation As Begin Delete From teacher Where id=1; Update studentdetail Set

Dapper完美兼容Oracle,执行存储过程,并返回结果集。

这个问题,困扰了我整整两天. 刚刚用到Dapper的时候,感觉非常牛掰.特别是配合.net 4.0新特性dynamic,让我生成泛型集合,再转json一气呵成. 不过,各种ORM总有让人吐槽的地方... 比如,我之前在SqlServer上写测试,搞封装,没有任何问题.CURD.批量操作.存储过程.事物等. 可是以转到Oracle上,就出问题了[喂~不是说好的支持Oracle的么] 在写Dapper+Oracle单元测试的前期,是没有问题的,也就是说普通的Sql操作是没有任何问题的. 然后,我写到

SQL SERVER: 给用户增加执行存储过程的权限

USE DatabaseName GO CREATE ROLE UserName GO GRANT EXECUTE TO UserName GOSQL SERVER: 给用户增加执行存储过程的权限

oracle 使用 dbms_lock.sleep暂停存储过程执行

grant execute on dbms_lock to USERNAME; ? dbms_lock.sleep(time)参数单位为秒 ? create or replace procedure initdata is num number := 0; begin ? for i in 1 .. 500 loop ? num := num + 1; if num >= 1000 then dbms_lock.sleep(5); num := 0; dbms_output.put_line('

Oracle定时任务执行存储过程备份日志记录表

写在前面 需求 备份系统日志表T_S_LOG, 按照操作时间字段OPERATETIME, 将每天的日志增量备份到另一张表. 思路 1.创建一张数据结构完全相同的表T_S_LOG_BAK作为备份表 2.查出T_S_LOG中需要备份的数据 3.将数据赋给游标变量 4.遍历游标将数据逐条插入T_S_LOG_BAK 5.创建无参存储过程将游标的这部分操作作为存储过程主体执行 6.创建定时任务定时执行该存储过程 操作环境 Oracle11g T_S_LOG日志表(部分数据) 1 -- ----------

Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

Oracle存储过程可以有无参数存储过程和带参数存储过程. 一.无参程序过程语法 create or replace procedure NoParPro as ; begin ; exception //存储过程异常 ; end;         二.带参存储过程实例 create or replace procedure queryempname(sfindno emp.empno%type) as         sName emp.ename%type;         sjob emp

Oracle存储过程----存储过程执行简单的增删改查

1.存储过程执行增加的sql create or replace procedure test_add(id varchar,name varchar,time varchar,age varchar,sex varchar) is begin insert into table(id,name,time,varchar,age,sex); commit; end; 执行语句如下: set serveroutput on; call test_add('01','zhangsan','2019-