【问题标题】:GRANT SELECT doesn't work in altered sessionGRANT SELECT 在更改的会话中不起作用
【发布时间】: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 对象拥有帐户),另外一个可能具有为支持团队编写权限。

标签: oracle oracle11g


【解决方案1】:

您的所有者是AppUser,大小写不一。因此,在语句中使用时需要引用它,否则Oracle会将其转换为大写。

所以你可以试试这个:

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;

Oracle: What exactly do quotation marks around the table name do?

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2021-12-19
    • 2011-04-22
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多