0

在 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        
4

1 回答 1

1

User2 尝试查询表时出现什么错误?User2 发出的确切查询是什么?

最常见的问题是 User2 没有使用模式名称限定表名。默认情况下,User2 需要执行类似的操作

SELECT *
  FROM User1.MyTable

如果您不想限定表名,您可以在 User2 的架构中为 User1 的 MyTable 创建同义词

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架构中而不是当前用户的架构中解析。

于 2012-05-23T21:35:44.397 回答