【问题标题】:Oracle Indexes EXECUTE object privilegeOracle 索引 EXECUTE 对象权限
【发布时间】:2015-03-30 01:45:21
【问题描述】:

更新:

我问过,因为如果我们运行这个语句:

select * from v$object_privilege where object_type_name = 'INDEX';

我们得到了这个:

.

所以我假设某些用户可能/可能无法执行这些索引,作为一种安全形式。

或者我错了,这些都没有意义?

感谢您的回答!

--

下午好,

我想知道为什么 oracle 索引有 EXECUTE 权限,但是每次我们尝试将其授予角色/用户时,我们都会收到相同的错误:

SQL Error: ORA-04042: procedure, function, package, or package body does not exist.

该对象非常好,当我们尝试将其设置为 oracle 默认创建的索引时,甚至会出现此错误。

亲切的问候,

山姆

【问题讨论】:

  • 我建议将其发布在 dba.stackexchange.com 上。
  • 您不能授予索引权限。你在运行什么声明?为什么你认为你需要这样的东西?
  • 您能否举个例子说明您的意思——您在哪里看到该特权,如果它现在在您的数据库中,显示它的查询?您是否将 index 与 indextype 或基于函数的索引的函数混淆了?
  • 如何执行索引?
  • 我添加了一些图片来展示它给我带来的这些问题。

标签: database oracle indexing privileges oracle12c


【解决方案1】:

INDEX(NOT INDEXTYPE) 对象上没有 PRIVILEGES(既没有 EXECUTE 权限),正如自己的 DICTIONARY 所说:

select * from sys.V_$OBJECT_PRIVILEGE where object_type_name = 'INDEX';

OBJECT_TYPE_NAME      OBJECT_TYPE_ID PRIVILEGE_ID PRIVILEGE_NAME                                                 
--------------------- -------------- ------------ ---------------
INDEX                 32                       12 EXECUTE  

检查 OBJECT_TYPE_ID = 32 对应:

select * from REPCAT$_OBJECT_TYPES where OBJECT_TYPE_ID = 32;

OBJECT_TYPE_ID OBJECT_TYPE_NAME 
-------------- -----------------
                32 INDEX TYPE      

现在,INDEX TYPE 用于创建 DOMAINS,这意味着,应用程序特定的索引,需要 EXECUTE 权限,因为它与用户定义的索引函数和过程相关联,而不是实现索引类型。

这取自 Oracle 文档,也参考“使用可扩展索引”

创建索引类型:示例 以下语句创建一个名为 position_indextype 的 indextype,并指定 indextype 支持的 position_between 运算符和实现 index 接口的 position_im 类型。有关使用此 indextype 的可扩展索引方案,请参阅“使用可扩展索引”:

CREATE INDEXTYPE position_indextype
   FOR position_between(NUMBER, NUMBER, NUMBER)
   USING position_im;

在完整的实现结束时,你可以执行这个:

SELECT last_name, salary FROM employees    WHERE
 position_between(salary, 10, 20)=1    ORDER BY salary DESC, last_name;

完整实现here.

【讨论】:

    【解决方案2】:

    EXECUTE 权限可以授予INDEXTYPE

    http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9013.htm#r9c1-t49

    CREATED INDEX ... 语句创建的“普通”索引不需要此权限,也不能拥有。

    更新:

    1) 需要执行权限,因为INDEXTYPE 使用OPERATOR,它使用PL/SQL 函数。因此,当您创建域索引时,您需要能够执行用于操作员的函数。

    2) 为什么它在系统字典中显示为INDEX 而不是INDEXTYPE - 这里我们只能猜测。我认为他们决定这样做是因为域 INDEX 是特定于应用程序的类型索引 (http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_5012.htm#i2062403) 的实例。

    所以独立的 INDEXTYPE 没有多大意义。但同样,这只是我的假设。

    【讨论】:

    • 你能解释一下为什么INDEXTYPE 需要这个特权吗?为什么不在视图中将其标记为INDEXTYPE 而不是INDEX
    【解决方案3】:

    oracle 文档中的一些声明,

    要在您自己的架构中创建索引,必须满足以下条件之一:

    • 要索引的表或集群必须在您自己的架构中。
    • 您必须对要编制索引的表具有 INDEX 对象权限。
    • 您必须具有 CREATE ANY INDEX 系统权限。

    “要在另一个模式中创建索引,您必须具有 CREATE ANY INDEX 系统特权。此外,包含索引的模式所有者必须具有 UNLIMITED TABLESPACE 系统特权或表空间的空间配额包含索引或索引分区。”

    "要在自己的架构中创建域索引,除了创建常规索引的先决条件外,还必须对 indextype 具有 EXECUTE 对象权限。如果您在其他用户的架构中创建域索引schema,那么索引所有者还必须对 indextype 及其底层实现类型具有 EXECUTE 对象权限。在创建域索引之前,应先定义 indextype。"

    如果您运行多层应用程序,您可以使用 db-role“创建资源”为应用程序的存储库创建一个 oracle 模式。使用此角色,您可以创建表以保存数据并在表上创建索引,您无需考虑“执行”权限。

    dba通常不允许“在另一个模式中创建索引”的方式。

    【讨论】:

      猜你喜欢
      • 2010-11-18
      • 1970-01-01
      • 2017-07-06
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多