当前位置: 首页 > 知识库问答 >
问题:

Oracle:数据库是属于用户还是用户属于数据库?

益承颜
2023-03-14

我也使用了SQL和Oracle,但我有一个很大的困惑。在oracle中,用户属于数据库还是数据库属于用户。因为我已经使用sql命令在oracle中创建了一个新用户。然后我创建了表,但我没有创建任何数据库,那么新表去了哪里?

我猜想表与oracle中的用户相关联,就像创建表的人是表的所有者,其他用户无法访问该表,因此无需通过先创建数据库,然后在其下创建表来区分它们。

但是在MYSQL中(使用PhpMyAdmin),首先我们必须创建一个数据库,然后在该数据库中我们必须创建表。

但在oracle中,我们只需使用具有授权权限的有效用户登录,就可以开始创建表,而无需创建数据库。但这些表放在哪个数据库中?

如果我们考虑MySQL的java JDBC连接

连接con=DriverManager。getConnection(
“jdbc:mysql://localhost:3306/mydb“,”用户名“,”密码“);

在这里,我们将mydb指定为数据库名称,但我们考虑了Oracle 11g xpress edition的JDBC连接:

Connection con=DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521: xe","USERNAME","PWD");

并没有提到数据库名称,它只包含ip、端口、sid、用户名和密码,但我们仍然能够访问表名。

所以我的问题是oracle有什么问题?为什么我们不必指定库名,在oracle中是否不需要创建数据库,默认数据库概念是否存在并且足够?

我们可以看到jdbc连接语法没有提到库名,所以我应该假设表可以根据哪个用户创建它来区分,而不是根据它在哪个数据库下。

目前我正在使用Oracle 11g速成版

共有3个答案

南宫博简
2023-03-14

我会说,在Oracle中,用户位于数据库之下。

数据库通常在Oracle数据库软件安装期间创建。显然,您可以稍后创建它(例如,如果您只安装了软件)或添加另一个。

当您登录数据库时,您使用:

sqlplus username/password@SID

SID标识数据库实例(库名实例号)。例如,如果您的dbname为“myDatabase”并且实例号为“1”,则SID为“myDatabase ase1”。

因此,当您稍后创建新表时,它属于您的用户,而用户属于数据库。稍后您可以像这样选择此表:

select * from username.your_table_name;

当您使用JDBC连接进行连接时,您也会给出SID:

jdbc:oracle:thin:@[HOST][:PORT]:[SID]
戚升
2023-03-14

甲骨文在这方面可能有点令人困惑。文档非常善于解释概念。

简而言之。数据库是代表数据库的一堆物理文件的集合。与其他系统一样,将数据库视为备份和恢复的单元很方便。

你不会问一个例子。这本质上是一个服务器,服务器只能运行一个数据库。通常,数据库和实例是可互换的,尽管“数据库”指的是数据,“实例”指的是连接性。

数据库本身包含模式,模式包含表、视图和存储过程等对象。模式可能“看起来”像其他系统中的数据库,因为它们有一个名称并包含表。模式通常以用户命名,因为每个用户都有自己的命名空间。用户通常被授予特定于给定命名空间的权限。

也就是说,模式/命名空间是安全单元,而不是备份/恢复单元。

因此,数据库包含用户。用户代表包含表的模式。用户可以在同一数据库的模式内和模式之间拥有角色和权限。

而且,为了进一步混淆问题,用户可以在多个数据库之间共享,但这是另一回事。

钮实
2023-03-14

Q: 所以我的问题是,甲骨文出了什么问题?为什么我们不必指定数据库名称,是否不需要在oracle中创建数据库,默认的数据库概念已经存在并且已经足够了?"

A: 在思考MySQL的“用户”和“数据库”概念时,在将这些概念转换为Oracle时。。。

在甲骨文中,这是同一件事。他们是一体的。

在MySQL中,可以使用数据库名称限定对表名的引用:

SELECT * FROM mydatabasename.mytablename ;

在Oracle中,我们可以用表的“所有者”限定表名:

SELECT * FROM mytableowner.mytablename ;

当我们在MySQL中引用一个没有限定的表名时,它被解释为对“当前数据库”中表的引用。

在Oracle中,不合格的表引用被解释为对当前用户“拥有”的表的引用。(如果该名称的对象不属于当前用户,则Oracle会在特殊PUBLIC所有者下查找该名称的对象。)

更让人困惑的是。。。Oracle术语“数据库”的含义与MySQL中的含义大不相同。。。Oracle数据库与MySQL数据库不同。

在Oracle中,要查看当前用户拥有的表,可以查询USER_TABLES视图。

要查看当前用户具有权限的表,包括其他用户拥有的表,请查询“所有表”视图。此视图还返回一个所有者列,该列显示拥有该表的用户。

如果当前用户具有SELECT_CATALOG_ROLE特权,您可以查询DBA_TABLES以查看所有用户拥有的所有表,无论您是否对这些表具有特权。此视图还包括OWNER列。

(用户、所有和DBA的命名约定适用于所有字典视图,而不仅仅是表。

 类似资料:
  • 我对oracle数据库非常陌生,请原谅我在问题中的任何技术错误。我使用的是oracle 19c,我认为我的“system”用户密码与“sysdba”用户密码不同。在安装时,我每次都使用相同的密码,但现在连接到system或“\as sysdba”时,连接没有问题,但当我键入“orcl_listener”或“orcl”或“sysdba”的密码时,密码是错误的。例如:conn sysdba输入密码:错

  • 本文向大家介绍数据字典属于哪一个用户的?相关面试题,主要包含被问及数据字典属于哪一个用户的?时的应答技巧和注意事项,需要的朋友参考一下 答案: 数据字典是属于’SYS’用户的,用户‘SYS’ 和 ’SYSEM’是由系统默认自动创建的

  • 问题内容: 在PHP中使用单例而不是全局的数据库连接有什么好处?我觉得使用单例而不是全局会使代码变得不必要地复杂。 全局编码 用Singleton编码 如果除了全局或单例之外,还有一种更好的初始化数据库连接的方法,请提及它并描述它比全局或单例具有的优势。 问题答案: 我知道这很旧,但是Dr8k的答案 几乎 就在那里。 当您考虑编写一段代码时,假设它会改变。这并不意味着您要假设它会在将来的某个时刻对

  • 我想让我的web应用程序使用mongodb和spring data multitenat。 基本上,我希望将所有实体(集合)复制到不同的数据库中。然后(基于一些规则,例如登录系统的用户),我想将一些实体实例(文档)存储到正确的数据库中。 例如,我有一个名为DBNameProviderService的服务。动态返回数据库名称的getDbName()。如何使用此服务动态选择正确的数据库? 编辑 抱歉,

  • 主要内容:Oracle数据库的版本,甲骨文公司,Oracle的历史Oracle数据库是一个关系数据库管理系统。 它也叫OracleDB或简称Oracle。 Oracle数据库由Oracle公司生产和销售。 Oracle数据库是第一个专为企业网格计算而设计的数据库。 企业网格计算提供了最灵活,最经济的方式来管理信息和应用程序。 Oracle数据库的版本 Oracle数据库主要有四个版本,如下所示 - - 企业版: 它是最强大和最安全的版本。 它提供所有功能,包括卓

  • 问题内容: 我正在尝试使用JNDI为Spring Web应用程序设置数据库连接属性。 我正在考虑以下两种方法: 方法1: 在你的Spring配置中,你可能会有类似以下内容: 然后,在你的webapp /META-INF/context.xml文件中,你也应该具有类似的内容: 在你的web.xml中,你应该像这样: 方法二: 在Spring上下文中这样设置: 你可以使用类似下面的命令在Tomcat的