同义词和基础 table 的访问权限
Access right on synonym and underlying table
1/ 同义词和底层对象的权限有何关联?如果一个人拥有同义词的权利,他是否会自动拥有 table 的权利,反之亦然?
Oracle 说
When you grant object privileges on a synonym, you are really granting
privileges on the underlying object, and the synonym is acting only as
an alias for the object in the GRANT statement
这意味着对同义词的特权就足够了。这将绕过 table 权限。
Another source 表示 table 上的访问权限就足够了,同义词权限没有任何意义。
这是否意味着对同义词或基础 table 的特权就足够了?
2/ private 和 public 同义词的行为是否相同。我还没有真正看到将用户的同义词权限授予 "see/access" 的示例。如何将私有同义词的权限授予用户?
Oracle 文档和您提到的消息说的完全相同。不授予同义词特权。当您尝试授予同义词特权时,数据库实际上对同义词引用的对象执行授予。因此,同义词是 public 还是 private 都没有区别,因为实际授权是在同义词引用的对象上进行的。
祝你好运。
编辑
让我们演示一下会发生什么:
-- Logged in as user BOB2
CREATE TABLE RPJ_TEST (N NUMBER);
SELECT *
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'RPJ_TEST';
-- the above statement returns no rows
CREATE SYNONYM RPJ_TEST_SYN -- create synonym
FOR RPJ_TEST;
SELECT *
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'RPJ_TEST';
-- the above statement returns no rows
GRANT SELECT ON RPJ_TEST TO BOB; -- grant on table
SELECT *
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'RPJ_TEST';
-- the above statement returns
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
BOB BOB2 RPJ_TEST BOB2 SELECT NO NO
GRANT UPDATE ON RPJ_TEST_SYN TO BOB2; -- grant "on synonym" actually performs grant on table
SELECT *
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'RPJ_TEST';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
BOB BOB2 RPJ_TEST BOB2 SELECT NO NO
BOB BOB2 RPJ_TEST BOB2 UPDATE NO NO
请注意,在授予同义词 RPJ_TEST_SYN 之后,授予同义词引用的 table 的权限已更改。
来自 Oracle 文档 "A public synonym is owned by the special user group named PUBLIC and is accessible to every user in a database. A private synonym is contained in the schema of a specific user and available only to the user and to grantees for the underlying object."
在模式 B 的 TABLE X 上使用 public 同义词 PUBS,用户 A 可以访问用户 B 的 table X。在 TABLE Y 上使用私有同义词 PVTS在模式 B 中,用户 A 无法访问用户 B 的 table Y,除非如上所述明确授予访问权限。
我的两分钱:-
假设在abc_owner schema 中定义了一个table tab1 并且在abc_user schema 中创建了它的同义词,那么:-
运行 abc_user 模式中的这样的授权:-
GRANT SELECT ON tab1 TO def_owner;
可能成功或失败,具体取决于 abc_user 对 abc_owner 中对象的授权。
如果它只有 select grants,上面的查询将失败。
然后您将必须在所有者架构本身中执行此操作。
1/ 同义词和底层对象的权限有何关联?如果一个人拥有同义词的权利,他是否会自动拥有 table 的权利,反之亦然?
Oracle 说
When you grant object privileges on a synonym, you are really granting privileges on the underlying object, and the synonym is acting only as an alias for the object in the GRANT statement
这意味着对同义词的特权就足够了。这将绕过 table 权限。
Another source 表示 table 上的访问权限就足够了,同义词权限没有任何意义。
这是否意味着对同义词或基础 table 的特权就足够了?
2/ private 和 public 同义词的行为是否相同。我还没有真正看到将用户的同义词权限授予 "see/access" 的示例。如何将私有同义词的权限授予用户?
Oracle 文档和您提到的消息说的完全相同。不授予同义词特权。当您尝试授予同义词特权时,数据库实际上对同义词引用的对象执行授予。因此,同义词是 public 还是 private 都没有区别,因为实际授权是在同义词引用的对象上进行的。
祝你好运。
编辑
让我们演示一下会发生什么:
-- Logged in as user BOB2
CREATE TABLE RPJ_TEST (N NUMBER);
SELECT *
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'RPJ_TEST';
-- the above statement returns no rows
CREATE SYNONYM RPJ_TEST_SYN -- create synonym
FOR RPJ_TEST;
SELECT *
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'RPJ_TEST';
-- the above statement returns no rows
GRANT SELECT ON RPJ_TEST TO BOB; -- grant on table
SELECT *
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'RPJ_TEST';
-- the above statement returns
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
BOB BOB2 RPJ_TEST BOB2 SELECT NO NO
GRANT UPDATE ON RPJ_TEST_SYN TO BOB2; -- grant "on synonym" actually performs grant on table
SELECT *
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'RPJ_TEST';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
BOB BOB2 RPJ_TEST BOB2 SELECT NO NO
BOB BOB2 RPJ_TEST BOB2 UPDATE NO NO
请注意,在授予同义词 RPJ_TEST_SYN 之后,授予同义词引用的 table 的权限已更改。
来自 Oracle 文档 "A public synonym is owned by the special user group named PUBLIC and is accessible to every user in a database. A private synonym is contained in the schema of a specific user and available only to the user and to grantees for the underlying object."
在模式 B 的 TABLE X 上使用 public 同义词 PUBS,用户 A 可以访问用户 B 的 table X。在 TABLE Y 上使用私有同义词 PVTS在模式 B 中,用户 A 无法访问用户 B 的 table Y,除非如上所述明确授予访问权限。
我的两分钱:- 假设在abc_owner schema 中定义了一个table tab1 并且在abc_user schema 中创建了它的同义词,那么:-
运行 abc_user 模式中的这样的授权:-
GRANT SELECT ON tab1 TO def_owner;
可能成功或失败,具体取决于 abc_user 对 abc_owner 中对象的授权。 如果它只有 select grants,上面的查询将失败。 然后您将必须在所有者架构本身中执行此操作。