请考虑Oracle 11g数据库上的以下场景。
用户 ADMIN 执行以下操作:
CREATE USER Alice IDENTIFIED BY pwdalice;
GRANT CREATE SESSION TO Alice;
CREATE ROLE Viewer IDENTIFIED BY pwdviewer;
GRANT Viewer TO Alice;
GRANT SELECT ON Table_1 TO Viewer;
然后 Alice 以“Alice”身份登录数据库并执行以下命令:
SELECT * FROM Table_1;
爱丽丝收到以下错误:
SELECT * FROM Table_1
*
ERROR at line 1:
ORA-00942: table or view does not exist
我认为授予角色特权将使其成员用户能够获得这些特权。但是,这种情况表明事实并非如此。我在这里想念什么?如何使用角色将 SELECT 授予 Alice?
更新:
按照答案,尝试了 3 次修复,但均未成功
1) 使用完全限定的表名
我错过了在 SELECT * FROM Table_1;
命令中包含模式名称。但是,即使添加了如下所示的架构名称,仍然会出现错误。
爱丽丝执行:
SELECT * FROM ADMIN.Table_1;
得到错误:
SELECT * FROM ADMIN.Table_1
*
ERROR at line 1:
ORA-00942: table or view does not exist
2) 使用全限定表名的同义词
不幸的是,这似乎也不能解决问题。
Alice 执行以下操作:
CREATE SYNONYM Syn_Table_1 FOR ADMIN.Table_1;
CREATE SYNONYM Syn_Table_1 FOR ADMIN.Table_1
*
ERROR at line 1:
ORA-01031: insufficient privileges
3) 改变会话
ALTER SESSION SET current_schema = ADMIN;
Session altered.
SELECT * FROM Table_1;
SELECT * FROM Table_1
*
ERROR at line 1:
ORA-00942: table or view does not exist
除了确保您处于正确的架构中之外,请尝试这个;
以 Alice 身份登录后,执行以下操作:
SET ROLE Viewer IDENTIFIED BY pwdviewer;
更多请看这里
您创建的角色受密码保护。因此,当爱丽丝登录时,默认情况下不启用它。
您需要使用表的完全限定名称,因为
Alice
不拥有该表。例如,如果表的所有者是
TABLE_1_OWNER
:`Alice 还可以在她自己的模式中创建指向表的同义词,从而无需完全限定名称:
问题是名称解析之一,而不是特权。
该表
table_1
存在于架构以外的其他Alice
架构中。何时Alice
运行查询Oracle 将在当前模式中查看是否有一个名为 的对象
table_1
。由于没有这样的对象,因此会引发错误。您可以通过限定表名告诉 Oracle 对象所在的模式来解决此问题
或者,您可以创建提供映射的同义词(公共或私有)。例如,作为 Alice,您可以创建私有同义词
一旦你这样做了,爱丽丝就可以简单地
因为 Alice 的模式中有一个名为
table_1
(实际表的私有同义词)的对象。第三种选择是更改会话的当前模式。同样,作为爱丽丝,如果你跑
然后你就可以运行了
但是,如果您这样做,那么如果表名存在于 Alice 模式中,您将必须完全限定表名(当然,除非您
current_schema
再次更改)。如果在应用授予角色的同义词和权限的最佳实践方法后仍然存在此问题,请确保被授予者的用户帐户已启用所有角色:ALTER USER DEFAULT ROLE ALL
此外,我看到您需要与用户建立新连接以允许通过角色授予。“简单”的重新连接不起作用。
默认情况下,管理员名称是 system。
因此,当 Alice 以“Alice”身份登录数据库并执行以下命令时:
注意:检查表所属的用户,比如表是否属于用户 shub 写查询为:
如果您还没有解决这个问题,请尝试先创建角色并添加相应的权限。然后创建用户并为其分配角色。
按照这个顺序,我认为它应该可以工作。它对我有用,我遇到了同样的问题。
在类似的情况下,以下对我有用。
sqlplus / 作为 sysdba
授予连接、资源、创建视图、选择任何表、创建同义词、选择任何字典给 [您的用户];
我知道这个解决方案并非适用于所有情况,但这是我最后的手段。