如何在Oracle中查找模式名称?当您使用只读用户在sql会话中连接时

Vip*_*pin 19 sql oracle11g

我连接到一个带有只读用户的oracle数据库,我在sql developer中设置连接时使用了服务名,因此我不知道SID(模式).

我怎样才能找到我所连接的架构名称?

我正在寻找这个,因为我想生成ER图,并在该过程中一步请求选择模式.当我试图选择我的用户名时,我得到任何表,因为我猜所有表都与模式用户映射.

编辑:我得到了我的答案部分由评论中提供的下面的SQL弗兰克,它给了我所有者名称,这是我的情况下的架构.但我不确定它是否适用于所有情况的通用解决方案.

select owner, table_name from all_tables.
Run Code Online (Sandbox Code Playgroud)

编辑:我认为上面的sql在所有情况下都是正确的解决方案,因为schema是所有db对象的所有者.所以我得到的架构或所有者都是相同的.之前我对架构的理解不正确,我经历了另一个问题,发现架构也是一个用户.

Frank/a_horse_with_no_name把它放回答案中,这样我就可以接受了.

Dan*_*nga 28

调用SYS_CONTEXT以获取当前架构.来自Ask Tom"如何获得当前架构:

select sys_context( 'userenv', 'current_schema' ) from dual;
Run Code Online (Sandbox Code Playgroud)

  • 它给出了与"select user from dual"相同的结果,这是我的只读用户.因为当DBA创建时只读用户模式也是自动创建的并且它不会改变,直到我们运行"alter session set current_schema = foobar" (2认同)

Cod*_*odo 19

要创建只读用户,您必须设置与拥有您要访问的表的用户不同的用户.

如果您只是创建用户并向只读用户授予SELECT权限,则需要在每个表名前添加模式名称.为避免这种情况,您基本上有两种选择:

  1. 在会话中设置当前架构:
ALTER SESSION SET CURRENT_SCHEMA=XYZ
Run Code Online (Sandbox Code Playgroud)
  1. 为所有表创建同义词:
CREATE SYNONYM READER_USER.TABLE1 FOR XYZ.TABLE1
Run Code Online (Sandbox Code Playgroud)

因此,如果您没有被告知所有者架构的名称,您基本上有三个选项.最后一个应该始终有效:

  1. 查询当前架构设置:
SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL
Run Code Online (Sandbox Code Playgroud)
  1. 列出你的同义词:
SELECT * FROM ALL_SYNONYMS WHERE OWNER = USER
Run Code Online (Sandbox Code Playgroud)
  1. 调查所有表(除了一些众所周知的标准模式):
SELECT * FROM ALL_TABLES WHERE OWNER NOT IN ('SYS', 'SYSTEM', 'CTXSYS', 'MDSYS');
Run Code Online (Sandbox Code Playgroud)