用户和Oracle中的架构有什么区别?
用户和Oracle中的架构有什么区别?
Answers:
从问汤姆
您应该将模式视为用户帐户,并将其中的所有对象作为所有意图和目的的模式进行收集。
SCOTT是一种架构,包括具有各种授权和其他内容的EMP,DEPT和BONUS表。
SYS是一个包含大量表,视图,授权等的模式。
SYSTEM是一个架构.....
从技术上讲-模式是数据库使用的一组元数据(数据字典),通常使用DDL生成。模式定义数据库的属性,例如表,列和属性。数据库模式是对数据库中数据的描述。
我认为问题在于Oracle使用的术语“ 架构”与通常含义略有不同。
意义2中的模式与意义1中的模式相似,但不相同。例如,对于使用多个DB帐户的应用程序,意义2中的模式可能包含多个Oracle模式:-)。
加上模式也可能意味着在其他上下文中(例如在数学中)一堆其他的,不相关的东西。
Oracle应该只使用了“ userarea”或“ accountobjects”之类的术语,而不是“ schema”中的重载...
来自WikiAnswers:
此外,如果用户有权访问其他模式中的对象,则他们可以进行访问。
像平常一样考虑用户(具有登录名和访问系统中某些对象权限的用户名/密码),以及将模式作为用户主目录的数据库版本。用户“ foo”通常在模式“ foo”下创建事物,例如,如果用户“ foo”创建或引用表“ bar”,则Oracle将假定用户的意思是“ foo.bar”。
这个答案并没有定义所有者和架构之间的区别,但是我认为这增加了讨论的范围。
在我的小思想世界中:
我一直在创建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>
当应用程序用户只是主模式的替代入口点,不需要自己的对象时,此方法是理想的。
非常简单
If USER has OBJECTS
then call it SCHEMA
else
call it USER
end if;
可以授予用户访问不同用户拥有的架构对象的权限。
用户帐户就像拥有家庭钥匙的亲戚一样,但是不拥有任何东西,即用户帐户不拥有任何数据库对象...没有数据字典...
而模式是数据库对象的封装。就像拥有房屋中所有物品的房屋所有者一样,只有当所有者(即模式)为其提供所需的授权时,用户帐户才能访问房屋中的商品。
--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删除架构中的对象,然后自动删除用户。从其他架构(如视图和私有同义词)引用此架构对象的对象将变为无效状态。
我希望现在你们之间有所区别,如果您对此主题有任何疑问,请随时提出。
谢谢。
对于大多数熟悉MariaDB或MySQL的人来说,这似乎有点令人困惑,因为在MariaDB或MySQL中它们具有不同的架构(包括不同的表,视图,PLSQL块和DB对象等),而USERS是可以访问这些数据库的帐户模式。因此,没有特定的用户可以属于任何特定的架构。必须授予该架构许可,然后用户才能访问它。用户和模式在MySQL和MariaDB等数据库中分开。
在Oracle模式中,用户和用户几乎一样。要使用该架构,您需要具有权限,在该权限下,您会觉得架构名称只不过是用户名。可以跨架构授予权限,以从不同的架构访问不同的数据库对象。在oracle中,我们可以说用户拥有一个架构,因为当您创建用户时,您会为其创建数据库对象,反之亦然。
好吧,我在某处读到,如果您的数据库用户具有DDL特权,则它是模式,否则是用户。