Oracle 索引 EXECUTE 对象权限

Oracle Indexes EXECUTE object privilege

更新:

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

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

我们得到这个:

.

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

或者我错了,none 这有道理吗?

对您的回答表示诚挚的问候!

--

下午好,

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

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

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

亲切的问候,

山姆

EXECUTE 权限可以授予 INDEXTYPE:

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

"Normal" 由 CREATED INDEX ... 语句创建的索引不需要此权限,也不可能有。

更新:

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

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

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

oracle文档中的一些声明,

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

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

"To create an index in another schema, you must have the CREATE ANY INDEX system privilege. Also, the owner of the schema to contain the index must have either the UNLIMITED TABLESPACE system privilege or space quota on the tablespaces to contain the index or index partitions."

"To create a domain index in your own schema, in addition to the prerequisites for creating a conventional index, you must also have the EXECUTE object privilege on the indextype. If you are creating a domain index in another user's schema, then the index owner also must have the EXECUTE object privilege on the indextype and its underlying implementation type. Before creating a domain index, you should first define the indextype."

如果您运行 是一个多层应用程序,您可以使用 db-role "create resource" 为您的应用程序存储库创建一个 oracle 模式。有了这个角色,你可以创建 table 来持久化你的数据并在你的表上创建索引,你不需要考虑 "execute" 特权。

这种方式"create an index in another schema"一般是dba不允许的。

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 文档,也参考 "Using Extensible Indexing"

创建索引类型:示例 以下语句创建一个名为 position_indextype 的索引类型,并指定索引类型支持的 position_between 运算符和实现索引接口的 position_im 类型。请参阅 "Using Extensible Indexing" 以了解使用此索引类型的可扩展索引方案:

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.