【问题标题】:ORA-00904 error after granting select on a table of objectORA-00904 在对象表上授予选择后出错
【发布时间】: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 会告诉您)

标签: oracle


【解决方案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 ,它应该返回结果。我的意思是你必须使用列名代替*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2019-12-18
  • 2016-08-17
  • 2014-08-10
相关资源
最近更新 更多