暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 包、角色、编译和调用者权限以及包权限。

askTom 2017-05-31
515

问题描述





我需要从另一个架构 (B) 中的表中进行选择。我通过使用代理帐户连接到架构 (A)。
特权已通过角色授予我,我可以使用sqlplus从架构B中选择表。

模式A中有试图从模式B中选择的包。它无法访问表,编译失败。

数据库高级应用程序开发人员指南: 6编码PL/SQL子程序和软件包状态
要创建无错误 (成功编译子程序或包),需要以下附加权限:
-必须为代码主体中引用的所有对象明确授予子程序或软件包的所有者必要的对象特权。
-所有者无法通过角色获得所需的特权。

我试图通过以下方式编译包
-使用 'authid current_user'
-授予访问模式B的权限直接到包。

我没有成功。

有没有办法做到这一点,除了直接给表权限,这是不可行的,因为代理帐户的使用。
为什么我的尝试失败了?


左侧

专家解答

你引用的医生对我来说很清楚。如果要在schema a中编译引用schema B的包,则需要直接将表权限授予A。角色不起作用。authid definer子句对编译没有影响。

所以要么你需要:

-将B的表的特权直接授予A
-在B中创建软件包并为此授予执行

我不确定代理帐户与此有什么关系。使用此用户时,您仍然可以通过PL/SQL之外的角色访问您拥有的表。并且您可以在B中执行该过程,当它:

create role r;
grant r to chris;

create user u identified by u;
alter user chris grant connect through u;

conn hr/hr

grant select on employees to r;

conn u[chris]/u

select count(*) from hr.employees;

COUNT(*)  
107 

conn chris/chris

select count(*) from hr.employees;

COUNT(*)  
107 

create or replace procedure p is
begin
  for emps in (
    select * from hr.employees where employee_id > 200
  ) loop
    dbms_output.put_line('EMP ID: ' || emps.employee_id);
  end loop;
end p;
/
sho err

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/5      PL/SQL: SQL Statement ignored
4/22     PL/SQL: ORA-00942: table or view does not exist
6/5      PL/SQL: Statement ignored
6/40     PLS-00364: loop index variable 'EMPS' use is invalid

conn hr/hr

grant select on employees to chris;

conn chris/chris

create or replace procedure p is
begin
  for emps in (
    select * from hr.employees where employee_id > 200
  ) loop
    dbms_output.put_line('EMP ID: ' || emps.employee_id);
  end loop;
end p;
/

Procedure P compiled

conn u[chris]/u

exec p;

EMP ID: 201
EMP ID: 202
EMP ID: 203
EMP ID: 204
EMP ID: 205
EMP ID: 206
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论