为ODBC创建oracle只读用户

为ODBC创建oracle只读用户,oracle,Oracle,我已使用在oracle数据库上创建了一个用户 create user xxx identified by test; grant create session to xxx; grant select any table to xxx; grant select any dictionary to xxx; 我还从Excel设置了一个ODBC连接,该连接对用户yyy很好,但当我尝试对xxx执行相同操作时,我得到一个错误:表或视图不存在 所以我的问题是,如何让表显示/可供用户xxx使用 谢谢你

我已使用在oracle数据库上创建了一个用户

create user xxx identified by test; 
grant create session to xxx;
grant select any table to xxx;
grant select any dictionary to xxx;
我还从Excel设置了一个ODBC连接,该连接对用户yyy很好,但当我尝试对xxx执行相同操作时,我得到一个错误:表或视图不存在

所以我的问题是,如何让表显示/可供用户xxx使用

谢谢你的帮助。
干杯

您需要在模式XXX中为模式YYY中的表创建同义词

grant create synonym to XXX;
以用户YYY的身份运行此SQL

select 'CREATE SYNONYM ' ||tname|| ' for  '||'YYY.'||TNAME||';'  from tab
where tname not like 'BIN$%'
例如,输出此sql

CREATE SYNONYM TEST2 for  YYY.TEST2;
CREATE SYNONYM TEST_ARCHIVE for  YYY.TEST_ARCHIVE;
CREATE SYNONYM TEST_ONLINE for  YYY.TEST_ONLINE;
以XXX的身份运行此SQL

CREATE SYNONYM TEST2 for  YYY.TEST2;
CREATE SYNONYM TEST_ARCHIVE for  YYY.TEST_ARCHIVE;
CREATE SYNONYM TEST_ONLINE for  YYY.TEST_ONLINE;

同义词的解决方案是可以的。另一个选项是更改当前模式

  • 将alter会话授予xxx
  • 以xxx的身份登录
  • 登录数据库后<代码>更改会话设置当前模式=yyy

  • 现在,每个对象的名称将在模式yyy下解析

    很抱歉,也要清楚,用户xxx应该对数据库/表具有只读访问权限。如果提供更多信息,它可能会帮助您获得答案。例如,谁是表的所有者(从该表调用授予的用户),该表是否具有公共synonym@ThomasG-请解释您如何认为连接“属于默认模式(SYS)。首先,没有“默认”模式,当然不是SYS,谁拥有王国的钥匙。其次,当用户连接时,他总是”属于“(奇怪的术语)他自己的模式,其中所有不合格的名称引用都解析为他自己的命名空间。感谢您的评论,我对此设置非常陌生,也是我第一次尝试此设置。我正在使用用户XXX创建用户YYY(在数据库中称为oracle)。当我以YYY身份登录时,我可以在用户ORACLE下看到数据库中的所有表,但当我以用户YYY身份登录时,我看不到任何表。@Designer分析我不确定如何检查所有者或其是否具有公共同义词。或完全限定表名,即从YYY中选择*。某些表而不是从中选择*有些表。在第一种情况下,OP会准确地知道他们正在访问哪个表。