【发布时间】:2015-10-13 07:25:03
【问题描述】:
我有以下情况。我需要编写一个程序来让一个模式访问另一个模式的对象。问题是这个过程是由管理帐户通过flyway执行的。
我尝试了很多选择,但面临以下问题:
Error starting at line : 3 in command - (my begin...end procedure)
Error report -
ORA-00942: table or view does not exist
ORA-06512: at line 3
00942. 00000 - "table or view does not exist"
我的代码:
ALTER SESSION SET CURRENT_SCHEMA = AppUser;
BEGIN
FOR R IN (SELECT owner, table_name FROM dba_tables WHERE owner='AppUser') LOOP
EXECUTE IMMEDIATE 'GRANT SELECT ON '||R.owner||'.'||R.table_name||' TO QAUser';
END LOOP;
END;
在不改变架构的情况下它都不起作用。
【问题讨论】:
-
我很惊讶这完全有效;你的 OWNER 不应该是大写的(即
'APPUSER')吗?如果这是正确的,那么您的“管理”模式是否可以实际看到该表(您是否尝试过从中选择?)? -
是的,它是大写的,我只是用占位符更改了实际值。是的,管理模式可以通过
SELECT * FROM APPUSER.APPTABLE进行选择 -
使用 dbms_output.put_line('GRANT SELECT ON '||R.owner||'.'||R.table_name||' TO QAUser');在立即执行之前打印实际语句并共享结果
-
appuser 架构上的选择授权是否通过“WITH GRANT OPTION”授予?如果不是,那么这很可能是您的管理架构无法创建授权的原因。此外,您为什么将个人授权直接授予 qauser?创建一个只读角色然后将选择授权添加到该角色不是更好吗?然后只需将角色分配给 qauser 以及需要只读访问权限的任何其他用户。
-
是的;当其他用户加入时,可以节省未来的时间。通常,我通常会创建至少两个角色 - 一个是只读角色,一个具有运行应用程序用户所需的写入权限(这些用户是 NOT 对象拥有帐户),另外一个可能具有为支持团队编写权限。