【问题标题】:Difference between a user and a schema in Oracle?Oracle中用户和模式之间的区别?
【发布时间】:2023-03-17 10:55:01
【问题描述】:

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

【问题讨论】:

标签: oracle


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    --用户和模式

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

    --User 用户是连接数据库(服务器)的帐号。我们可以使用 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 用户名 CASCADE 所以 oracle 删除模式中的对象,然后自动删除用户,从其他模式(如视图和私有同义词)引用此模式对象的对象进入无效状态。

    我希望你现在能明白它们之间的区别,如果你对这个话题有任何疑问,请随时提问。

    谢谢。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        嗯,我在某处读到,如果您的数据库用户具有 DDL 权限,那么它就是架构,否则就是用户。

        【讨论】:

        • 这实际上是一个有用的区别 - 具有 CREATE 权限的用户与没有 CREATE 权限的用户不同
        【解决方案5】:

        这很简单。

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

        一个用户可能被授予访问不同用户拥有的架构对象的权限。

        【讨论】:

        • 实际上,人们打电话时会产生混淆 - 用户是架构。由于用户可能不是您解释的架构。用户可以简单地是访问其他用户架构的用户。
        【解决方案6】:

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

        【讨论】:

        • 这意味着一个用户可以拥有多个模式。我不相信这是可能的(在 Oracle 中);虽然用户 A 可能对架构 B 拥有完整的管理员权限,但后者将始终由用户 B拥有,即使没有人使用这样的用户名登录。跨度>
        【解决方案7】:

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

        Schema:关于数据库对象的信息集合。喜欢您书中的索引,其中包含有关该章的简短信息。

        Look here for details

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            在我的小世界里:

            我一直在为创建 N 个用户的想法而苦恼,我希望这些用户中的每个用户都“使用”(也就是使用)一个模式。

            Tim at oracle-base.com shows how to do this(有 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>
            

            当应用程序用户只是一个 主模式的替代入口点,不需要对象 自己的。

            【讨论】:

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

            Schema 是 DB.objects 的一种封装,涉及感兴趣的想法/领域,由 ONE 用户拥有。然后它将由具有抑制角色的其他用户/应用程序共享。因此,用户不需要拥有架构,但架构需要拥有所有者。

            【讨论】:

              【解决方案11】:

              架构和数据库用户是相同的,但是如果架构拥有数据库对象并且他们可以执行任何他们的对象但用户只是访问对象,他们不能执行任何 DDL 操作,直到架构用户为您提供适当的权限。

              【讨论】:

                【解决方案12】:

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

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

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

                加上 schema 还可以表示在其他上下文中(例如在数学中)的一堆其他完全不相关的事物。

                Oracle 应该只使用像“userarea”或“accountobjects”这样的术语,而不是在“schema”中重载...

                【讨论】:

                • @djangofan Afaik 这个问题是关于 Oracle,而不是关于 MS SQL。
                【解决方案13】:

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

                【讨论】:

                • 简洁的描述,但为什么你对用户和模式都使用“foo”?!它们必须相同吗?
                • 在 Oracle 中,USER 是帐户名,SCHEMA 是该用户拥有的对象集。即使,Oracle 创建 SCHEMA 对象作为 CREATE USER 语句的一部分,并且 SCHEMA 与 USER 具有相同的名称,但它们注意相同的事情。当然,造成混淆的部分原因在于 USER 和 SCHEMA 之间存在一一对应关系,并且用户的模式共享其名称。
                【解决方案14】:

                来自Ask Tom

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

                SCOTT 是一个包含 EMP、DEPT 和 BONUS 表以及各种授权的架构,以及 其他东西。

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

                SYSTEM 是一个模式.....

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

                【讨论】:

                • 来自同一页面:出于所有意图和目的,只需考虑 user = schema = user = schema = 相同的东西。
                • 但是我可以让两个用户使用相同的架构吗?
                • 如果您的意思是“单个架构中的对象可以被多个用户'拥有'”,答案是否定的。如果您的意思是“单个架构中的对象可以被多个用户使用”,答案是肯定是的
                【解决方案15】:

                来自WikiAnswers

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

                此外,如果有权限,用户可以访问自己架构以外的架构中的对象。

                【讨论】:

                • 好点 re CREATE SCHEMA - 我认为命令名称选择不当!
                • “CREATE SCHEMA 命令不会像它所暗示的那样创建“模式”。我认为 99% 的困惑来自于此。而这个句子片段很好地清除了它。谢谢。
                • 我认为这是最好的答案。
                猜你喜欢
                • 2011-02-18
                • 2012-12-15
                • 2019-02-12
                • 1970-01-01
                • 1970-01-01
                • 2020-09-13
                • 2021-08-02
                • 2016-03-01
                • 2017-04-29
                相关资源
                最近更新 更多