ORA-00904 在对象表上授予选择后出错

Posted

技术标签:

【中文标题】ORA-00904 在对象表上授予选择后出错【英文标题】:ORA-00904 error after granting select on a table of object 【发布时间】:2017-12-29 11:38:26 【问题描述】:

Oracle 在对象表上授予选择时遇到问题。

当创建表时像

create table t (name char, ...) 

那么我可以毫无问题地将任何权限授予任何用户。

但是当表是从一个对象创建时,即

create or replace 
type type_client under type_personne (
   num int ,
   username varchar(30),
   balance int,
   ta table_achat,
   ref_admin ref type_admin,

   member function get_prix_achat_total return int
);

create table t of type_client

例如,我尝试将其选择给user1,但是当我从user1 连接并尝试从该表中选择任何数据时:

select * from system.table_client

我看到了消息:

ORA-00904: : 无效标识符 00904. 00000 - “%s:无效标识符” *原因: *行动: 行错误:1 列:34

有时我会看到消息:

内部错误:未知或未实现的访问器类型:9

【问题讨论】:

当你说“它不起作用”时,你的意思是什么?您是否收到错误消息,如果是,是什么? 当我尝试从表中选择一些数据时,看到消息:ORA-00904: : invalid identifier 00904. 00000 - "%s: invalid identifier" *原因:*操作:行错误: 1 列:34 @user9152856 - 请edit your question 显示person 对象的定义、您正在运行的实际查询以及您遇到的错误。听起来您引用对象字段不正确,而不是权限问题。 不直接相关,但您不应该将自己的对象创建为系统或任何内置帐户。为您的对象创建一个单独的用户/模式。 @user9152856 - 只是好奇,您使用的是哪个版本的 Oracle? (如果您不确定,select * from v$version 会告诉您) 【参考方案1】:

您的Select 查询似乎不是correct。您可以按以下方式进行:

SQL> show user
USER is "SCOTT"

SQL> CREATE TYPE emp_type AS OBJECT (
  2    eno     NUMBER,
  3    ename   VARCHAR2(36));
  4  /

Type created.

SQL> CREATE TABLE emp_tp OF emp_type;

Table created.

SQL> GRANT SELECT on emp_tp TO system ;

Grant succeeded.

SQL> connect
Enter user-name: system
Enter password: ****
Connected.

SQL> show user
USER is "SYSTEM"

SQL> Select * from scott.emp_tp;--<--Make sure you put schema name before table name

no rows selected

SQL> 

编辑:

正如我在 cmets 中提到的,对象定义也具有 member 函数。所以如果你这样做 Select tb.get_prix_achat_total() from t tb ,它应该返回结果。当定义中有任何功能时,您必须使用列名代替*

【讨论】:

table_client 表是由系统创建的...当我从 user1 连接时,我编写了查询“select * from system.table_client”但同样的错误... @user9152856 按照我的步骤,我清楚地展示了一个demo..不管是谁创建的表,一旦授予它应该可以被选中。阅读我的完整帖子,尤其是 select 声明, 我的意思是你的代码工作正常,因为对象和表是由 scott 创建的,所以实际上系统可以在没有任何授权的情况下看到它们.. 但在我的情况下,系统创建对象和表,并且普通用户尝试连接到表.. 我尝试在 type_client 上授予执行权限,但我看到了同样的错误..! 反之亦然。但是当你选择时我可以看到问题,你对象也有一个成员函数。所以如果你这样做 Select tb.get_prix_achat_total() from t tb ,它应该返回结果。我的意思是你必须使用列名代替*

以上是关于ORA-00904 在对象表上授予选择后出错的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot “oracle.jdbc.OracleDatabaseException: ORA-00904: invalid identifier” 创建表时出错

ORA-00904: 分组子句后的标识符无效

尽管获得了 GRANT EXECUTE,但我在函数调用中得到“ORA-00904:无效标识符”

ORA-00904 标识符无效

双列的选择条件(ORA-00904:标识符无效)

ORA-00904: 子查询中的无效标识符(在选择子句中)