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

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

从问问汤姆

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

SCOTT是一个架构,包含EMP,DEPT和BONUS表以及各种补助金和其他东西。

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

SYSTEM是一个模式…..

技术上说 – 模式是数据库使用的元数据(数据字典)集合,通常使用DDL生成。 模式定义数据库的属性,如表,列和属性。 数据库模式是对数据库中数据的描述。

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

  1. Oracle的模式(如Nebakanezer的回答中所解释的):基本上是由用户帐户拥有的所有表和其他对象的集合,因此大致相当于用户帐户
  2. 模式一般来说:构成给定系统/应用程序的数据库的所有表,sprocs等的集合(如“开发人员应该与DBA讨论关于我们新应用程序的模式)”。

方式2中的模式与方式1中的模式相似,但不同。例如,对于使用多个DB帐户的应用程序,方式2中的模式可能由几个Oracle模式组成:-)。

Plus 模式也可能意味着在其他情况下(例如math)的其他一些相当不相关的东西。

甲骨文应该只是使用像“userarea”或“accountobjects”,而不是过度的“模式”…

来自WikiAnswers :

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

而且,如果用户有权这样做,则用户可以访问架构以外的对象。

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

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

在我小小的思想世界里:

我一直在努力创buildN个用户,我希望每个用户都“消费”(也就是使用)一个模式。

在oracle-base.com上的Tim展示了如何做到这一点 (有N个用户,每个用户将被“redirect到”一个模式。

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

CURRENT_SCHEMA方法

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

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

 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; 

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

接下来,我们创build一些angular色来允许读写和只读访问。

 CREATE ROLE schema_rw_role; CREATE ROLE schema_ro_role; 

我们希望给我们的应用程序用户读写模式对象的权限,所以我们授予相关angular色。

 GRANT schema_rw_role TO app_user; 

我们需要确保应用程序用户的默认模式指向架构所有者,所以我们创build一个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; / 

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

 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; 

注意如何授予相关angular色的权限。 没有这个,对象就不会被应用程序用户看到。 我们现在有一个正常运行的架构所有者和应用程序

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

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

这很简单。

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

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

Schema是关于intrest的想法/域的DB.objects的封装,并且由ONE用户拥有。 然后它将被其他angular色压制的用户/应用程序共享。 所以用户不需要拥有一个模式,但是一个模式需要拥有一个拥有者。

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

基于我对Oracle的一点了解…一个USER和一个SCHEMA有些相似。 但是也有一个主要的区别。 如果“用户”拥有任何对象,则用户可以被称为SCHEMA,否则…它将只保留“用户”。 一旦用户拥有至less一个对象,那么凭借上面所有的定义….用户现在可以被称为SCHEMA。

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

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

看这里的细节

用户帐户就像亲戚谁拥有一个关键到你家,但不拥有任何东西,即用户帐户不拥有任何数据库对象…没有数据字典…

模式是数据库对象的封装。 这就像房子的拥有者拥有房子里的一切东西,只有当所有者(即模式)给予必要的资助时,用户账户才能够在家中访问货物。

– 用户和SCHEMA

用户和模式这两个词是可以互换的,这就是为什么大多数人对这个词在下面的混淆,我解释了他们之间的差异

– 用户用户是连接数据库(服务器)的帐户。 我们可以通过使用CREATE USER user_name IDENTIFIED BY密码来创build用户。

–schema

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

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

我们可以通过使用DROP SCHEMA schama_name RESTRICT语句来删除模式,但是它不能删除scehema包含对象,因此要删除模式,它必须是空的。这里的限制词强制指定该模式与out对象。

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

我希望现在你们有了区别,如果你对这个话题有任何疑问,请随时询问。

谢谢。

架构是对象的容器。 它由用户拥有。

那么,我读了一个地方,如果你的数据库用户具有DDL权限,那么它是一个架构,否则它是一个用户。