用户和Oracle中的架构之间的区别?


314

用户和Oracle中的架构有什么区别?


17
+1我也一直想知道区别:-/。
sleske

9
下面有一篇有趣的文章可以
Sandeep Jindal

9
Oracle模式类似于Windows OS中的“我的文档”文件夹。用户可以向其他用户授予权限,以查看其架构中的内容。Oracle模式本质上是用户的工作区。
Tarzan

3
在DBA上也进行了讨论:dba.stackexchange.com/questions/37012/…

Answers:


136

问汤姆

您应该将模式视为用户帐户,并将其中的所有对象作为所有意图和目的的模式进行收集。

SCOTT是一种架构,包括具有各种授权和其他内容的EMP,DEPT和BONUS表。

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

SYSTEM是一个架构.....

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


47
在同一页面上:出于所有意图和目的,只需考虑user = schema = user = schema =同一件事。
2009年

4
但是我可以让两个用户使用相同的架构吗?
John John Pichler 2015年

6
如果你的意思是“可以在一个单一的模式对象是由多个用户‘拥有’的”答案是否定的。如果你的意思是“可以在一个单一的架构对象由多个用户使用”答案是肯定是
马赫什

95

我认为问题在于Oracle使用的术语“ 架构”与通常含义略有不同。

  1. Oracle的模式(如Nebakanezer的答案所述):基本上是一个用户帐户拥有的所有表和其他对象的集合,因此大致相当于一个用户帐户
  2. 一般而言,模式:构成给定系统/应用程序的数据库的所有表,存储过程等的集合(如“开发人员应与DBA讨论新应用程序的模式”。)

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

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

Oracle应该只使用了“ userarea”或“ accountobjects”之类的术语,而不是“ schema”中的重载...


@djangofan Afaik这个问题是关于Oracle的,而不是关于MS SQL的。
peterh-恢复莫妮卡

62

来自WikiAnswers

  • 模式是数据库对象的集合,包括表,视图,序列,存储过程,同义词,索引,集群和数据库链接等逻辑结构。
  • 用户拥有架构。
  • 用户和架构具有相同的名称。
  • CREATE USER命令创建一个用户。它还会自动为该用户创建一个架构。
  • CREATE SCHEMA命令不会像它暗示的那样创建“模式”,它仅允许您在单个事务中创建多个表和视图并在您自己的模式中执行多个授予。
  • 出于所有意图和目的,您可以将用户视为架构,将架构视为用户。

此外,如果用户有权访问其他模式中的对象,则他们可以进行访问。


3
关于CREATE SCHEMA的要点-我认为该命令的名称选择错误!
杰弗里·肯普

4
“ CREATE SCHEMA命令未按其暗示的方式创建“模式””。我认为有99%的困惑来自此。这个句子片段很好地清除了它。谢谢。
granadaCoder


我认为这是最好的答案。
hagrawal

50

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


2
简洁的描述,但是为什么要在用户和模式上都使用“ foo”?他们必须一样吗?
JonnyRaa

在Oracle中,USER是帐户名,SCHEMA是该用户拥有的对象集。即使,Oracle在CREATE USER语句的一部分中创建SCHEMA对象,并且SCHEMA与USER具有相同的名称,但是它们具有相同的含义。当然,造成混淆的部分原因是,USER和SCHEMA之间存在一对一的对应关系,并且用户的模式共享其名称。
Mahesh

17

这个答案并没有定义所有者和架构之间的区别,但是我认为这增加了讨论的范围。

在我的小思想世界中:

我一直在创建N个用户,我希望这些用户中的每一个“消费”(也就是使用)单个模式的想法使我感到困惑。

oracle-base.com上的Tim演示了如何执行此操作(拥有N个用户,并且这些用户中的每一个将被“重定向”到单个模式。

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

CURRENT_SCHEMA 方法

此方法使用CURRENT_SCHEMA会话属性自动将应用程序用户指向正确的架构。

首先,我们创建架构所有者和应用程序用户。

CONN sys/password AS SYSDBA

-- Remove existing users and roles with the same names.
DROP USER schema_owner CASCADE;
DROP USER app_user CASCADE;
DROP ROLE schema_rw_role;
DROP ROLE schema_ro_role;

-- Schema owner.
CREATE USER schema_owner IDENTIFIED BY password
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON users;

GRANT CONNECT, CREATE TABLE TO schema_owner;

-- Application user.
CREATE USER app_user IDENTIFIED BY password
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp;

GRANT CONNECT TO app_user;

请注意,应用程序用户可以连接,但没有任何表空间配额或创建对象的特权。

接下来,我们创建一些角色以允许读写和只读访问。

CREATE ROLE schema_rw_role;
CREATE ROLE schema_ro_role;

我们希望为我们的应用程序用户提供对架构对象的读写访问权限,因此我们授予相关角色。

GRANT schema_rw_role TO app_user;

我们需要确保应用程序用户的默认架构指向架构所有者,因此我们创建了AFTER LOGON触发器来为我们执行此操作。

CREATE OR REPLACE TRIGGER app_user.after_logon_trg
AFTER LOGON ON app_user.SCHEMA
BEGIN
  DBMS_APPLICATION_INFO.set_module(USER, 'Initialized');
  EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=SCHEMA_OWNER';
END;
/

现在,我们准备在架构所有者中创建一个对象。

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;
GRANT SELECT, INSERT, UPDATE, DELETE ON test_tab TO schema_rw_role;

注意如何将特权授予相关角色。否则,对象对应用程序用户将不可见。现在,我们有了一个运作良好的架构所有者和应用程序用户。

SQL> CONN app_user/password
Connected.
SQL> DESC test_tab
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 ID                                                    NOT NULL NUMBER
 DESCRIPTION                                                    VARCHAR2(50)

SQL>

当应用程序用户只是主模式的替代入口点,不需要自己的对象时,此方法是理想的。


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

15

非常简单

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

可以授予用户访问不同用户拥有的架构对象的权限。


1
实际上,当人们打电话给用户时,就会造成混乱。由于用户可能不是您所解释的架构。用户可以简单地是访问其他用户模式的用户。
Sandeep Jindal

3

架构是DB.object的封装,涉及一个intrest的想法/域,并且由ONE用户拥有。然后它将被角色被禁止的其他用户/应用程序共享。因此,用户不需要拥有架构,但是架构需要具有所有者。


1

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

而模式是数据库对象的封装。就像拥有房屋中所有物品的房屋所有者一样,只有当所有者(即模式)为其提供所需的授权时,用户帐户才能访问房屋中的商品。


1

--USER和SCHEMA

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

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

-架构

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

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

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

如果尝试在其架构中删除用户包含对象,则必须指定CASCADE字,因为oracle不允许您删除用户包含对象。DROP USER user_name CASCADE,因此oracle删除架构中的对象,然后自动删除用户。从其他架构(如视图和私有同义词)引用此架构对象的对象将变为无效状态。

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

谢谢。


0

模式用户和数据库用户是相同的,但是如果模式拥有数据库对象,并且他们可以执行其对象的任何操作,但用户只能访问对象,那么在模式用户给予您适当的特权之前,他们不能执行任何DDL操作。


0

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


0

用户:访问数据库资源。就像一把钥匙进入房屋。

模式:收集有关数据库对象的信息。像书中的索引一样,其中包含有关本章的简短信息。

在这里查看详细信息


0

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

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


-1

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


1
这意味着用户可以拥有多个架构。我不认为这是可能的(在Oracle中);尽管用户A可能拥有对架构的完全管理权限B,但该架构将始终用户所有B,即使没有人使用该用户名登录。

-1

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


这实际上是一个有用的区别-具有CREATE privs的用户与没有CREATE privs的用户不同
Andrew Wolfe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.