ChatGPT解决这个技术问题 Extra ChatGPT

Oracle中用户和模式之间的区别?

Oracle 中的用户和模式有什么区别?

+1我也一直想知道区别:-/。
下面有一篇有趣的文章解决了所有的疑惑:http://radiofreetooting.blogspot.com/2007/02/user-schema.html
Oracle 模式类似于 Windows 操作系统中的“我的文档”文件夹。用户可以向其他用户授予权限以查看其架构中的内容。 Oracle 模式本质上是用户的工作区。
在 DBA 上也进行了讨论:dba.stackexchange.com/questions/37012/…

M
Mark Sherretta

来自Ask Tom

您应该将架构视为用户帐户和其中所有对象的集合,作为用于所有意图和目的的架构。

SCOTT 是一个包含 EMP、DEPT 和 BONUS 表以及各种授权和其他内容的模式。

SYS 是一个包含大量表、视图、授权等的模式。

SYSTEM是一个模式......

从技术上讲——模式是数据库使用的一组元数据(数据字典),通常使用 DDL 生成。模式定义了数据库的属性,例如表、列和属性。数据库模式是对数据库中数据的描述。


从同一页面:出于所有意图和目的,只需考虑用户 = 架构 = 用户 = 架构 = 同一件事。
但是我可以让两个用户使用相同的架构吗?
如果您的意思是“单个架构中的对象是否可以由多个用户'拥有'”,答案是否定的。如果您的意思是“单个架构中的对象是否可以被多个用户使用”,答案肯定是肯定的
s
sleske

我认为问题在于甲骨文使用术语模式与它通常的含义略有不同。

Oracle 的架构(如 Nebakanezer 的回答中所解释的):基本上是用户帐户拥有的所有表和其他对象的集合,因此大致相当于一个用户帐户 Schema:构成数据库的所有表、存储过程等的集合对于给定的系统/应用程序(如“开发人员应与 DBA 讨论我们新应用程序的架构。”)

意义 2 中的模式与意义 1 中的模式相似,但并不相同。例如,对于使用多个数据库帐户的应用程序,意义 2 中的模式可能包含多个 Oracle 模式:-)。

加上模式也可能意味着在其他上下文中(例如在数学中)的一堆其他相当不相关的事情。

Oracle 应该只使用像“userarea”或“accountobjects”这样的术语,而不是在“schema”中重载......


@djangofan Afaik 这个问题是关于 Oracle 的,而不是关于 MS SQL 的。
我同意,Oracle 不应该使用“模式”这个词,这让刚接触 Oracle 的人感到尴尬。类似于“模式访问”的东西,因为它提供了对(真实)模式的部分(或全部)的(可重用)访问。
h
harto

WikiAnswers

模式是数据库对象的集合,包括表、视图、序列、存储过程、同义词、索引、集群和数据库链接等逻辑结构。

用户拥有一个模式。

用户和模式具有相同的名称。

CREATE USER 命令创建一个用户。它还会自动为该用户创建一个模式。

CREATE SCHEMA 命令不会像它所暗示的那样创建“模式”,它只允许您在单个事务中创建多个表和视图并在您自己的模式中执行多个授权。

出于所有意图和目的,您可以将用户视为模式,将模式视为用户。

此外,如果有权限,用户可以访问他们自己的模式以外的模式中的对象。


重新创建模式的好点-我认为该命令的名称选择不当!
“CREATE SCHEMA 命令不会像它所暗示的那样创建“模式”。我认为 99% 的困惑来自于此。而这个句子片段很好地清除了它。谢谢你。
我认为这是最好的答案。
A
Andru Luvisi

像往常一样考虑用户(有权登录和访问系统中某些对象的用户名/密码)和作为用户主目录的数据库版本的模式。用户“foo”通常在模式“foo”下创建东西,例如,如果用户“foo”创建或引用表“bar”,那么 Oracle 将假定用户的意思是“foo.bar”。


简洁的描述,但为什么你对用户和模式都使用“foo”?!它们必须相同吗?
在 Oracle 中,USER 是帐户名,SCHEMA 是该用户拥有的对象集。即使,Oracle 创建 SCHEMA 对象作为 CREATE USER 语句的一部分,并且 SCHEMA 与 USER 具有相同的名称,但它们注意相同的事情。当然,混淆部分源于 USER 和 SCHEMA 之间存在一一对应关系,并且用户的模式共享其名称。
A
Air

这个答案没有定义所有者和模式之间的区别,但我认为它增加了讨论。

在我的小世界里:

我一直在为创建 N 个用户的想法而苦苦挣扎,我希望每个用户在其中“消费”(又名,使用)一个模式。

Tim at oracle-base.com shows how to do this(有 N 个用户,每个用户都将被“重定向”到单个架构。

他有第二种“同义词”方法(此处未列出)。我在这里只引用 CURRENT_SCHEMA 版本(他的方法之一):

CURRENT_SCHEMA 方法 此方法使用 CURRENT_SCHEMA 会话属性自动将应用程序用户指向正确的模式。首先,我们创建模式所有者和应用程序用户。 CONN sys/password AS SYSDBA -- 删除现有的同名用户和角色。 DROP USER schema_owner 级联;删除用户 app_user 级联; DROP ROLE schema_rw_role; DROP ROLE schema_ro_role; -- 架构所有者。 CREATE USER schema_owner IDENTIFIED BY password DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON users;授予连接,创建表到 schema_owner; -- 应用用户。 CREATE USER app_user IDENTIFIED BY password DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;授予 app_user 连接;请注意,应用程序用户可以连接,但没有任何表空间配额或创建对象的权限。接下来,我们创建一些角色来允许读写和只读访问。创建角色 schema_rw_role;创建角色 schema_ro_role;我们希望为我们的应用程序用户提供对模式对象的读写访问权限,因此我们授予相关角色。将 schema_rw_role 授予 app_user;我们需要确保应用程序用户的默认架构指向架构所有者,因此我们创建了一个 AFTER LOGON 触发器来为我们执行此操作。登录后创建或替换触发器 app_user.after_logon_trg app_user.SCHEMA BEGIN DBMS_APPLICATION_INFO.set_module(USER, 'Initialized');立即执行 'ALTER SESSION SET current_schema=SCHEMA_OWNER';结尾; / 现在我们准备在模式所有者中创建一个对象。 CONN schema_owner/password CREATE TABLE test_tab (id NUMBER, description VARCHAR2(50), CONSTRAINT test_tab_pk PRIMARY KEY (id)); GRANT SELECT ON test_tab TO schema_ro_role;将 test_tab 上的 SELECT、INSERT、UPDATE、DELETE 授予 schema_rw_role;请注意权限是如何授予相关角色的。没有这个,应用程序用户将看不到对象。我们现在有一个正常工作的模式所有者和应用程序用户。 SQL> CONN app_user/password 已连接。 SQL> DESC test_tab 名称为空?类型 - - - - - - - - - - - - - - - - - - - - - - - - - ---- -------- ------------------------------------ ID NOT NULL NUMBER 描述 VARCHAR2(50) SQL> 当应用程序用户只是主模式的替代入口点,不需要自己的对象时,此方法是理想的。


请注意,使用角色可能无法解决 PL/SQL 代码的权限问题。运行编译存储过程时,不会以直观的方式传播对角色的对象授予。但是,我赞成这个答案,因为这种方法确实很棒,但据我所知,它鲜为人知且很少使用。
P
Peter Mortensen

这很简单。

If USER has OBJECTS
then call it SCHEMA
else
     call it USER
end if;

一个用户可以被授予访问不同用户拥有的模式对象的权限。


实际上,当人们打电话时会产生混淆 - 用户是架构。由于用户可能不是您解释的架构。用户可以简单地是访问其他用户模式的用户。
S
Sudheer

Schema 是 DB.objects 关于感兴趣的想法/领域的封装,由一个用户拥有。然后它将由具有抑制角色的其他用户/应用程序共享。所以用户不需要拥有一个模式,但一个模式需要有一个所有者。


S
SanthoshReddy

--用户和模式

用户和模式这两个词是可以互换的,这就是为什么大多数人对下面这个词感到困惑我解释了它们之间的区别

--User 用户是连接数据库(服务器)的帐户。我们可以使用 CREATE USER user_name IDENTIFIED BY password 创建用户。

--架构

实际上Oracle数据库包含处理数据的逻辑和物理结构。模式也是逻辑结构来处理数据库中的数据(内存组件)。它在用户创建时由 oracle 自动创建。它包含与该架构关联的用户创建的所有对象。例如,如果我创建了一个名为 santhosh 的用户,那么 oracle 创建一个名为 santhosh 的架构,oracle 将用户 santhosh 创建的所有对象存储在 santhosh架构。

我们可以通过 CREATE SCHEMA 语句创建模式,但 Oracle 会自动为该模式创建用户。

我们可以使用 DROP SCHEMA schama_name RESTRICT 语句删除架构,但它不能删除包含对象的架构,因此要删除架构,它必须为空。这里的限制字强制指定没有对象的架构。

如果我们试图在他的模式中删除用户包含的对象,我们必须指定 CASCADE 字,因为 oracle 不允许您删除用户包含的对象。 DROP USER user_name CASCADE 所以 oracle 删除模式中的对象,然后自动删除用户,从其他模式(如视图和私有同义词)引用此模式对象的对象进入无效状态。

我希望现在您能了解它们之间的区别,如果您对此主题有任何疑问,请随时提出。

谢谢你。


P
Peter Mortensen

用户帐户就像持有您家的钥匙但不拥有任何东西的亲戚,即用户帐户不拥有任何数据库对象...没有数据字典...

而模式是数据库对象的封装。这就像拥有你房子里所有东西的房子的所有者,只有当所有者(即模式)向它提供所需的授权时,用户帐户才能访问家中的商品。


M
Mark Hall

架构和数据库用户是相同的,但是如果架构拥有数据库对象并且他们可以做任何他们的对象但用户只是访问对象,他们不能做任何 DDL 操作,直到架构用户给你适当的权限。


M
Michele La Ferla

根据我对 Oracle 的一点了解...... USER 和 SCHEMA 有点相似。但也有很大的不同。如果“USER”拥有任何对象,则可以将 USER 称为 SCHEMA,否则......它将仅保留为“USER”。一旦 USER 拥有至少一个对象,那么根据您上面的所有定义......现在可以将 USER 称为 SCHEMA。


V
VINOTH ENERGETIC

用户:访问数据库资源。就像进入房子的钥匙一样。

Schema:关于数据库对象的信息的集合。就像您书中的索引一样,其中包含有关该章的简短信息。

Look here for details


p
pritampanhale

对于大多数熟悉 MariaDB 或 MySQL 的人来说,这似乎并不令人困惑,因为在 MariaDB 或 MySQL 中,它们具有不同的模式(包括不同的表、视图、PLSQL 块和 DB 对象等),而用户是可以访问这些的帐户架构。因此,没有特定用户可以属于任何特定模式。必须向该架构授予权限,然后用户才能访问它。用户和模式在 MySQL 和 MariaDB 等数据库中是分开的。

在 Oracle 模式中,用户几乎被视为相同。要使用该架构,您需要拥有权限,您会觉得架构名称只不过是用户名。可以跨模式授予权限,以从不同的模式访问不同的数据库对象。在 oracle 中,我们可以说用户拥有模式,因为当您创建用户时,您会为其创建数据库对象,反之亦然。


P
Peter Mortensen

Schema 是对象的容器。它归用户所有。


这意味着用户可以拥有多个模式。我不相信这是可能的(在 Oracle 中);虽然用户 A 可能对架构 B 拥有完全的管理员权限,但后者将始终由用户 B拥有,即使没有人使用这样的用户名登录也是如此。
P
Peter Mortensen

好吧,我在某处读到,如果您的数据库用户具有 DDL 权限,那么它就是模式,否则就是用户。


这实际上是一个有用的区别 - 具有 CREATE privs 的用户与没有 CREATE privs 的用户不同