在Oracle中,用户和模式之间有什么区别?
在Oracle中,用户和模式之间有什么区别?
来自Ask Tom
你应该将模式视为用户帐户和其中所有对象的集合,就像所有意图的模式一样。
SCOTT是一个包括EMP、DEPT和BONUS表以及其他授权和其他内容的模式。
SYS是一个包括大量表、视图、授权等等的模式。
SYSTEM是一个模式.....
从技术上讲——模式是数据库使用的元数据(数据字典)集,通常使用DDL生成。模式定义了数据库的属性,例如表、列和属性。数据库模式是数据库中数据的描述。
我认为问题在于Oracle对术语schema的使用略有不同于一般含义。
在第2点中提到的模式与第1点中提到的模式类似,但并不完全相同。例如,对于使用多个DB账户的应用程序,一个第2点中的模式可能由多个Oracle模式组成 :-).
此外,schema在其他语境中也可以表示一堆其他不太相关的事物(例如,在数学中)。
Oracle应该使用类似于“userarea”或“accountobjects”的术语,而不是重载“schema”...
来自WikiAnswers:
此外,如果用户有访问权限,他们可以访问其他 schema 中的对象。
通常我们把用户看作是一个具有用户名和密码的实体,可以登录并访问系统中的某些对象,而模式则是用户家目录的数据库版本。例如,用户"foo"通常在模式"foo"下创建一些东西。如果用户"foo"创建或引用表"bar",那么Oracle会认为这个用户指的是"foo.bar"。
这个答案没有定义所有者和schema之间的区别,但我认为它有助于讨论。
在我自己的思考世界里:
我曾经苦恼于创建N个用户,我希望每个用户都可以“消耗”(即使用)一个单独的schema。
Tim在oracle-base.com上展示了如何做到这一点(拥有N个用户,并将这些用户“重定向”到一个单独的schema)。
他还有第二种“同义词”方法(未列在此处)。 我只引用了CURRENT_SCHEMA版本(他的方法之一):
CURRENT_SCHEMA
方法此方法使用
CURRENT_SCHEMA
会话属性自动将应用程序用户指向正确的schema。首先,我们创建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>
如果应用程序用户只是主架构的替代入口点,并不需要自己的对象,那么这种方法是理想的。
非常简单。
If USER has OBJECTS
then call it SCHEMA
else
call it USER
end if;
一个用户可能被授予访问不同用户拥有的模式对象的权限。--用户和模式
用户和模式这两个词是可以互换使用的,这就是为什么大多数人对这些词感到困惑。下面我解释一下它们之间的区别。
--用户 用户是连接数据库(服务器)的账户。我们可以通过使用CREATE USER user_name IDENTIFIED BY password来创建用户。
--模式
实际上,Oracle数据库包含逻辑和物理结构来处理数据。模式也是处理数据库(内存组件)中的数据的逻辑结构。当用户被创建时,Oracle会自动创建一个模式。它包含与该模式关联的用户创建的所有对象。例如,如果我创建了一个名为santhosh的用户,Oracle会创建一个名为santhosh的模式,Oracle将所有由用户santhosh创建的对象存储在santhosh模式中。
我们可以使用CREATE SCHEMA语句来创建模式,但Oracle会自动为该模式创建一个用户。
我们可以使用DROP SCHEMA schema_name RESTRICT语句来删除模式,但它不能删除包含对象的模式,因此要删除模式,它必须为空。这里的restrict关键字强制指定没有对象的模式。
如果我们试图删除一个包含在其模式中的用户对象,我们必须指定CASCADE关键字,因为Oracle不允许您删除包含对象的用户。 DROP USER user_name CASCADE 因此,Oracle会删除模式中的对象,然后自动删除用户,其他模式中引用此模式对象的对象(如视图和私有同义词)将变为无效状态。模式是关于感兴趣的领域/思想的DB.objects封装,由一个用户拥有。然后被其他带有禁止角色的用户/应用程序共享。因此,用户不需要拥有模式,但模式需要有所有者。