[英]How to find schema name in Oracle ? when you are connected in sql session using read only user
我使用只读用户连接到 oracle 数据库,并且在 sql developer 中设置连接时使用了服务名称,因此我不知道 SID(架构)。
如何找出我连接到的架构名称?
我正在寻找这个,因为我想生成 ER 图,并且在该过程中的一个步骤中它要求选择模式。 当我尝试选择我的用户名时,我没有得到任何表,因为我猜所有表都与模式用户映射。
编辑:我通过评论中提供的以下 sql Frank 部分得到了我的答案,它给了我所有者名称,在我的情况下是架构。 但我不确定它是否适用于所有情况的通用解决方案。
select owner, table_name from all_tables.
编辑:我认为上面的 sql 在所有情况下都是正确的解决方案,因为架构是所有 db 对象的所有者。 所以要么我得到架构要么所有者都是相同的。 早些时候我对架构的理解不正确,我通过另一个问题发现架构也是一个用户。
Frank / a_horse_with_no_name回答这个问题,这样我就可以接受了。
调用SYS_CONTEXT
以获取当前模式。 来自Ask Tom“如何获取当前架构:
select sys_context( 'userenv', 'current_schema' ) from dual;
要创建只读用户,您必须设置与拥有要访问的表的用户不同的用户。
如果您只是创建用户并向只读用户授予 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');
以下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';
复制结果并粘贴和运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.