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

Posted

技术标签:

【中文标题】如何在 Oracle 中查找模式名称?当您使用只读用户在 sql 会话中连接时【英文标题】:How to find schema name in Oracle ? when you are connected in sql session using read only user 【发布时间】:2014-04-13 10:17:13 【问题描述】:

我以只读用户连接到 oracle 数据库,并且我在 sql developer 中设置连接时使用了服务名称,因此我不知道 SID(架构)。

如何找出我连接的架构名称?

我正在寻找这个,因为我想generate ER diagram,并且在该过程中,它要求选择架构。当我尝试选择我的用户名时,我想得到任何表,因为我猜所有表都与模式用户映射。

编辑:我的答案部分是通过评论中提供的以下 sql Frank 得到的,它给了我所有者名称,在我的情况下是架构。但我不确定它是否适用于所有情况的通用解决方案。

select owner, table_name from all_tables.

编辑:我认为上面的 sql 在所有情况下都是正确的解决方案,因为 schema 是所有 db 对象的所有者。所以要么我得到模式或所有者都是相同的。早些时候我对架构的理解不正确,我通过另一个question 发现架构也是一个用户。

Frank/a_horse_with_no_name 把这个放在答案中,这样我就可以接受了。

【问题讨论】:

select user from dual; @a_horse_with_no_name 它提供了我的用户 ID,我需要架构用户。 我想我不明白你所说的“模式用户”是什么意思。如果您在谈论您有权访问的表的所有者,请运行 select distinct owner from all_tables @FrankSchmitt:但用户不一定与“当前模式”相同,您可以更改 Oracle 中的当前模式,在这种情况下:用户 模式。 【参考方案1】:

调用SYS_CONTEXT 以获取当前架构。来自Ask Tom "How to get current schema:

select sys_context( 'userenv', 'current_schema' ) from dual;

【讨论】:

它给出的结果与 "select user from dual" 相同,这是我的只读用户。因为当 DBA 创建只读用户模式时也会自动创建并且在我们运行“alter session set current_schema=foobar”之前它不会改变 是的,您应该事先致电alter session set current_schema=foobar Vipin 用户会给出登录的人,但不会给出实际的模式名称。如果您阅读了这个问题,那将告诉您使用 RO 用户登录,但会获取架构名称。即使在alter session set current_schema=foobar 之前执行此操作也不会为select user from dual 提供正确的模式名称【参考方案2】:

要创建只读用户,您必须设置一个不同于拥有您要访问的表的用户。

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

    在您的会话中设置当前架构
ALTER SESSION SET CURRENT_SCHEMA=XYZ
    为所有表创建同义词:
CREATE SYNONYM READER_USER.TABLE1 FOR XYZ.TABLE1

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

    查询当前架构设置:
SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL
    列出您的同义词:
SELECT * FROM ALL_SYNONYMS WHERE OWNER = USER
    调查所有表(一些众所周知的标准架构除外):
SELECT * FROM ALL_TABLES WHERE OWNER NOT IN ('SYS', 'SYSTEM', 'CTXSYS', 'MDSYS');

【讨论】:

使用 all_tables 的第三个选项对我有用,正如您在编辑部分中看到的那样,我只是在等待接受一些相同的答案:),而且您也提供了非常好的细节。【参考方案3】:

下面3个语句怎么样?

-- 更改为您的架构

ALTER SESSION SET CURRENT_SCHEMA=yourSchemaName;

-- 检查当前架构

SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL;

-- 生成删除表语句

SELECT 'drop table ', table_name, 'cascade constraints;' FROM ALL_TABLES WHERE OWNER = 'yourSchemaName';

复制结果粘贴运行

【讨论】:

以上是关于如何在 Oracle 中查找模式名称?当您使用只读用户在 sql 会话中连接时的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLAlchemy 中查找列使用的 Oracle 序列的名称?

如何查找 Oracle 服务名称

在从不同模式调用过程时如何在 oracle 中查找所有嵌套的依赖对象

如何使用 Amazon 资源名称 (ARN) 作为标识符来查找亚马逊资源?

如何在 oracle 中创建新模式并列出所有模式名称

是否可以使用模式匹配从 Oracle SQL 数据库中选择列?