【问题标题】:Oracle - select database to connectOracle - 选择要连接的数据库
【发布时间】:2021-04-27 23:38:27
【问题描述】:

所有,

在 MS SQL Server 和 Sybase 中,可以使用use <db_name> 选择服务器上的当前数据库。

据我通过谷歌搜索了解到,Oracle 11 只能有 1 个数据库。

但是如果我有最新的 Oracle - 有没有办法选择当前的数据库?

TIA!!

我目前正在使用 11g 和 ODBC。完成此测试后,我会将 Oracle 更新到最新版本。

【问题讨论】:

  • 您可能正在寻找alter session set container = ....
  • “数据库”一词在 oracle 中的含义/概念与在 MSSQL 或 Sybase 中的含义/概念截然不同。
  • @EdStevens,你能详细说明一下吗? DBMS 服务器是一个可以运行多个 DB 的服务器应用程序。现在可以连接到服务器,然后选择要使用的数据库或直接连接到该数据库。您可以选择使用本机客户端,使用 ODBC 连接到数据库实例。甲骨文不就是这样吗?另请参阅 OP 的更新。
  • Oracle 的“可插拔数据库”与 SQL Server 的“数据库”最接近。但是可插拔数据库在不再受支持的 11 版中不可用 - 它们是在 12.1 中引入的(也不再受支持)

标签: oracle


【解决方案1】:

在 SQL Server 中,“数据库”是“模式”的同义词:表、视图等对象的集合。在 Oracle 中,“数据库”是“服务器”或“实例”的同义词——运行的集合进程及其支持的数据文件(独立、CDB 或 PDB)。在 Oracle 中,拥有对象(表等)的“用户”与“模式”同义,因此 Oracle“用户”在概念上与 SQL Server“数据库”相同。无论是使用 OCI、ODBC 还是 JDBC 客户端连接到 Oracle,您都必须始终选择一个实例(使用 SID 或服务名称)一个用户/模式。

回答有关确定 Oracle 中当前模式的问题:当连接到 Oracle 数据库实例时,current_schema 会话参数确定如果您没有完全限定对象名称,则默认情况下,oracle 会将您的查询定向到哪个模式。可以使用以下命令设置:

alter session set current_schema=[username];

通过查询sys_context函数可以找到现有的会话参数值:

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

有关 sys_context 的更多信息,请参见此处:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/SYS_CONTEXT.html#GUID-B9934A5D-D97B-4E51-B01B-80C76A5BD086

有关 Oracle 模式和 SQL Server 数据库如何比较的更多信息,请参阅 dba.stackexchange.com 和 stackoverflow.com 上关于该主题的这些先前帖子:

【讨论】:

  • 感谢您的解释和链接。正如我所说,我现在正在尝试连接 ODBC。 ODBC接口有SQLGetInfo()可以返回数据库名。当我尝试它时 - 它没有返回它。我想我可以在你的回答中使用 PL/SQL 中的current_schema 来使用它。
  • 默认情况下,current_schema 将与您用于连接 Oracle 的用户名相同。除非您使用“alter session”命令明确设置它,否则它不会改变。您始终可以通过使用模式名称(例如 [owner].[table_name];myuser.mytable)完全限定对象名称来引用其他模式中的对象,或者通过在您的模式中创建指向的同义词其他模式中的对象。
  • 另请注意,1) 虽然很常见,但对于正在运行的应用程序而言,直接连接到拥有对象的用户/模式通常被认为是一种不好的安全做法; 2) 如果您要连接到正在引用其他模式中的对象的用户,则该用户必须具有访问这些对象的显式权限,并具有直接或通过角色授予的权限。如果没有适当的权限,对这些对象的任何引用都会引发错误。
【解决方案2】:

Oracle 有另一组术语。现在我说的是11g。 DBMS 是数据库+实例。 数据库是磁盘上的一组文件,它是你的软件、数据文件、控制文件等等。 实例是一组进程和内存结构,它是你正在运行的程序。当您启动 Oracle DBMS 时,您启动您的实例,实例安装数据库并打开数据库。 这一切都在一台服务器上运行,因此在一台服务器上,您有一个 Oracle DBMS,一个数据库和一个实例。 如果您有 RAC,则一个数据库可以有多个实例。这意味着,您有一台带有数据库的服务器和两台或更多带有实例的服务器,RAC 将在实例之间同步您的内存结构、事务等。 因此,在 Oracle 11g 中,服务器上没有“当前数据库”。在不同的服务器上有一个数据库和一个或多个(如果您有 RAC)实例。 当您连接到 Oracle 时,您将连接到一个实例。

Oracle 11 中 MS SQL Server 中“数据库”的分离是通过“模式”完成的。 Schema一般是一个用户,而数据库对象——表等属于一个schema ==一个用户。当您连接到 Oracle 时,您提供了一个用户名 - 这将是您的默认模式,您将在其中保存您的数据库对象。可以使用“alter session”更改您工作的架构。

从 Oracle 12 开始出现“可插拔数据库” - PDB。这意味着您有一个 CDB - 容器数据库作为根,您可以将多个 PDB 插入 CDB。这或多或少等同于 MS SQL Server“数据库”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2012-06-22
    • 2016-10-03
    • 2014-03-18
    • 2019-12-30
    • 2017-12-18
    相关资源
    最近更新 更多