【问题标题】:Why Oracle type created by one user is not visible by another user?为什么一个用户创建的 Oracle 类型对另一个用户不可见?
【发布时间】:2015-10-09 16:11:41
【问题描述】:

我在 OracleXE db 中有 2 个用户:ALICEBOB。以下步骤序列在我的本地机器上是成功的:

  • 连接为ALICE
  • 创建顶级类型:create or replace type testtype as object(x number(16)); (编辑:更正误导 Matthew McPeak 的错误名称 foo)
  • 连接为BOB
  • BOB 看到 ALICE 的类型:
    • select * from all_types 返回行
    • declare x ALICE.testtype; begin null; end; 编译

在类型对BOB 不可见的情况下应用于我们的开发数据库产生相同的步骤,即选择不返回该类型的行,PLSQL 块编译失败并出现PLS-00201: identifier 'ALICE.TESTTYPE' must be declared 错误。

我需要使类型可见,所以我问:什么可能导致这种差异?(我猜想某些需要授予类型或公共同义词,但这个简约的例子证明相反。)用户/会话的某些属性?尽管我希望解决方案是微不足道的,但我在谷歌搜索方面尽了最大努力,现在卡住了。两个数据库都是 Oracle 11g(11.2.0.1.0 开发,11.2.0.2.0 本地)。

谢谢!

【问题讨论】:

  • 可能 Bob 和 Alice 从一个数据库到另一个数据库具有不同的角色和权限

标签: database oracle rights-management


【解决方案1】:

我假设这不仅仅是您将类型命名为 foo 而是尝试将其用作 testtype 的事实。

如果foo 是正确的名称,则为ALICE

grant execute on foo to bob;

Bob 可能在第一个数据库中拥有EXECUTE ANY TYPE 或类似的系统权限。

【讨论】:

  • 抱歉,foo 错了,我从邮件重写时忽略了这个错字。谢谢,我很快就会在我的工作计算机上试用它。
  • 已解决。在我的本地机器上,Bob 已由系统用户创建并由来自此查询的脚本初始化:select 'grant ' || privilege || ' to BOB' from session_privs。因此,他确实拥有EXECUTE ANY TYPE 特权。限制权限后,一切恢复正常,grant execute on TESTTYPE to BOB/revoke execute on TESTTYPE from BOB 分别启用/禁用访问。
猜你喜欢
  • 2016-01-21
  • 1970-01-01
  • 2014-09-17
  • 2017-06-24
  • 2013-06-21
  • 2018-01-06
  • 2012-12-13
  • 2016-06-28
  • 1970-01-01
相关资源
最近更新 更多