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” 创建表时出错