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

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

282238 次浏览

WikiAnswers:

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

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

问汤姆

您应该将模式视为用户帐户和其中所有对象的集合

.作为所有意图和目的的模式 SCOTT是一个模式,其中包括EMP、DEPT和奖金表,以及各种授予 其他的东西。< / p >

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

SYSTEM是一个模式.....

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

将用户视为您通常所做的(用户名/密码,具有登录和访问系统中某些对象的权限),将模式视为用户主目录的数据库版本。用户“foo”通常在“foo”模式下创建东西,例如,如果用户“foo”创建或引用表“bar”,那么Oracle将假设用户指的是“foo.bar”。

模式是对象的容器。

.它属于用户

我认为问题是Oracle使用术语模式与它的一般含义略有不同。

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

概念2中的图式。是相似的,但不一样的模式在意义1。例如,对于一个使用多个数据库帐户的应用程序,意义2中的模式可能由几个Oracle模式组成:-)。

加上模式在其他上下文中也可以表示一堆其他的,相当不相关的东西(例如在数学中)。

Oracle应该使用“userarea”或“accountobjects”这样的术语,而不是重载“schema”……

模式和数据库用户是一样的,但如果模式拥有数据库对象,他们可以对对象做任何事情,但用户只能访问对象,他们不能做任何DDL操作,直到模式用户给你适当的特权。

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

在我小小的思想世界里:

我一直纠结于这样一个想法:我创建了N个用户,其中每个用户都“消费”(也就是使用)单个模式。

Tim在oracle-base.com上展示了如何做到这一点(有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>
当应用程序用户只是一个对象时,此方法是理想的 的可选主模式入口点,不需要对象 自己。< / p >

这很简单。

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

用户可以访问不同用户拥有的模式对象。

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

我在某处读到,如果您的数据库用户拥有DDL特权,那么它就是一个模式,否则它就是一个用户。

基于我对甲骨文的一点了解…USER和SCHEMA有些相似。但也有一个主要的区别。如果“USER”拥有任何对象,则可以将其称为SCHEMA,否则…它将只保留为“USER”。一旦USER拥有至少一个对象,那么根据上面的所有定义....USER现在可以称为SCHEMA。

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

架构:关于数据库对象的信息集合。就像你书中的索引,它包含了关于该章节的简短信息。

详细信息请看这里

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

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

——USER和SCHEMA

用户和模式这两个词是可以互换的,这就是为什么大多数人对下面这个词感到困惑的原因

——User“User”是连接数据库(Server)的帐号。我们可以使用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_name级联 因此oracle会删除模式中的对象,然后自动删除用户,从其他模式(如视图和私有同义词)中引用该模式的对象将进入无效状态

我希望你现在已经明白了它们之间的区别,如果你对这个话题有任何疑问,请尽管问。

谢谢你!

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

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