在Oracle中,MYTABLE
所有者为USER1
并为USER2
分配权限。但是在C#代码中,USER2
仍然无法访问该表。
如果我使用USER1
(所有者)用C#代码查询此表,它说:
无法执行查询
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------------------------------- --------- ---------
USER2 USER1 MYTABLE USER1 DELETE NO NO
USER2 USER1 MYTABLE USER1 SELECT NO NO
USER2 USER1 MYTABLE USER1 UPDATE NO NO
答案 0 :(得分:1)
User2尝试查询表时出现的错误是什么? User2发出的确切查询是什么?
最常见的问题是User2没有使用架构名称限定表名。默认情况下,User2需要执行类似
的操作SELECT *
FROM User1.MyTable
如果您不想限定表名,可以在User2的MyTable的User2架构中创建同义词
CREATE SYNONYM myTable
FOR User1.MyTable
或者您可以创建公共同义词(所有用户都可以看到公共同义词,但它们对权限没有影响)
CREATE PUBLIC SYNONYM myTable
FOR User1.MyTable
或者您可以在连接
后为会话设置current_schema
ALTER SESSION SET current_schema = User1
如果您执行上述任何操作,User2将能够运行查询
SELECT *
FROM MyTable
并MyTable
解析为User2.MyTable
。私有同义词是最小的足迹 - 它仅适用于User2,仅适用于MyTable
。公共同义词意味着任何已被授予User1.MyTable
权限的人都可以查询它,而无需使用模式名称限定表名。更改current_schema
意味着该会话的所有非限定对象引用将在User1
架构而不是当前用户的架构中解析。