Oracleのユーザーとスキーマの違いは?


314

Oracleのユーザーとスキーマの違いは何ですか?


17
+1私はいつも区別についても疑問に思っていました:-/。
sleske 2009

9
以下に興味深い記事があり、すべての疑問が解消されています。http
Sandeep Jindal

9
Oracleスキーマは、Windows OSのMy Documentsフォルダーに似ています。ユーザーは他のユーザーに自分のスキーマの内容を表示する権限を付与できます。Oracleスキーマは基本的にユーザーのワークスペースです。
Tarzan

3
DBAでも議論されています:dba.stackexchange.com/questions/37012/…

回答:


136

トムを掲載

スキーマは、ユーザーアカウントであり、その中のすべてのオブジェクトのコレクションを、すべての意図と目的のためのスキーマと見なす必要があります。

SCOTTは、さまざまな権限が付与されたEMP、DEPT、およびBONUSテーブルなどを含むスキーマです。

SYSは、大量のテーブル、ビュー、付与などを含むスキーマです。

SYSTEMはスキーマです。

技術的に-スキーマは、データベースで使用されるメタデータ(データディクショナリ)のセットであり、通常はDDLを使用して生成されます。スキーマは、テーブル、列、プロパティなど、データベースの属性を定義します。データベーススキーマは、データベース内のデータの記述です。


47
同じページから:すべての意図と目的のために、user = schema = user = schema =同じことを考えてください。
2009年

4
しかし、2人のユーザーが同じスキーマを使用することはできますか?
John John Pichler、2015年

6
「単一のスキーマ内のオブジェクトを複数のユーザーが「所有」できる」という意味の答えは「いいえ」です。「単一のスキーマ内のオブジェクトを複数のユーザーが使用できるのか」という意味であれば、答えは間違いなく「はい
Mahesh

95

問題は、Oracleがスキーマという用語をそれが一般的に意味するものとは少し異なる方法で使用していることだと思います。

  1. Oracleのスキーマ(Nebakanezerの回答で説明):基本的に、ユーザーアカウントが所有するすべてのテーブルとその他のオブジェクトのセット。ユーザーアカウントとほぼ同じです。
  2. 一般的なスキーマ:特定のシステム/アプリケーションのデータベースを構成するすべてのテーブル、sprocなどのセット(「開発者は、新しいアプリケーションのスキーマについてDBAと話し合う必要があります。」)

意味2のスキーマは類似していますが、意味1のスキーマと同じではありません。たとえば、複数のDBアカウントを使用するアプリケーションの場合、意味2のスキーマは複数のOracleスキーマで構成される可能性があります:-)。

プラススキーマは、他のコンテキスト(例:数学)で他のかなり関連のないものも意味します

Oracleは、 "スキーマ"をオーバーロードする代わりに、 "userarea"や "accountobjects"のような用語を使用するだけで済みます...


@djangofan Afaikこの質問はOracleに関するもので、MS SQLに関するものではありません。
peterh-モニカを2016年

62

WikiAnswersから:

  • スキーマは、テーブル、ビュー、シーケンス、ストアドプロシージャ、シノニム、インデックス、クラスター、データベースリンクなどの論理構造を含むデータベースオブジェクトのコレクションです。
  • ユーザーがスキーマを所有しています。
  • ユーザーとスキーマは同じ名前です。
  • CREATE USERコマンドはユーザーを作成します。また、そのユーザーのスキーマを自動的に作成します。
  • CREATE SCHEMAコマンドは、暗黙的に「スキーマ」を作成しません。単一のトランザクションで、複数のテーブルとビューを作成し、独自のスキーマで複数の付与を実行できるようにするだけです。
  • すべての意図と目的で、ユーザーをスキーマと見なし、スキーマをユーザーと見なすことができます。

さらに、ユーザーは、アクセス許可があれば、自分以外のスキーマのオブジェクトにアクセスできます。


3
CREATE SCHEMAについての良い点-私が考えるコマンドの選択が不十分な名前!
ジェフリーケンプ

4
「CREATE SCHEMAコマンドは、「スキーマ」を意味しません。」混乱の99%はこれに起因すると思います。そして、この文の断片はそれを非常によくクリアします。ありがとうございました。
granadaCoder 2013年


これが最良の答えだと思います。
hagrawal 16

50

通常どおりにユーザー(ログインしてシステム内の一部のオブジェクトにアクセスするためのユーザー名/パスワード)とスキーマをユーザーのホームディレクトリのデータベースバージョンとして考えます。ユーザー「foo」は通常、スキーマ「foo」の下に作成します。たとえば、ユーザー「foo」がテーブル「bar」を作成または参照する場合、Oracleはユーザーが「foo.bar」を意味すると想定します。


2
きちんとした説明ですが、なぜユーザーとスキーマの両方に「foo」を使用したのですか?それらは同じである必要がありますか?
JonnyRaa 2013年

Oracleでは、USERはアカウント名、SCHEMAはそのユーザーが所有するオブジェクトのセットです。ただし、OracleはCREATE USERステートメントの一部としてSCHEMAオブジェクトを作成し、SCHEMAはUSERと同じ名前ですが、同じことを示しています。もちろん、この混乱は、USERとSCHEMAの間に1対1の対応があり、ユーザーのスキーマがその名前を共有しているという事実にも一部起因しています。
Mahesh 2017

17

この回答は、所有者とスキーマの違いを定義するものではありませんが、議論に追加すると思います。

私の小さな思考の世界で:

私はN人のユーザーを作成し、これらの各ユーザーに単一のスキーマを "消費"(別名、使用)させたいという考えに苦労しました。

oracle-base.comのTimがこれを行う方法を示しています(N人のユーザーがいて、これらの各ユーザーは単一のスキーマに「リダイレクトされます」。

彼には2番目の「同義語」アプローチがあります(ここにはリストされていません)。ここでは、CURRENT_SCHEMAバージョン(彼のアプローチの1つ)のみを引用しています。

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>

この方法は、アプリケーションユーザーがメインスキーマへの代替エントリポイントであり、独自のオブジェクトを必要としない場合に理想的です。


1
ロールを使用しても、PL / SQLコードの権限の問題が解決しない場合があることに注意してください。ストアドプロシージャのコンパイル時に、ロールへのオブジェクトの付与が直感的に反映されません。ただし、このアプローチは非常に優れているため、私はこの回答を賛成しましたが、あまり知られておらず、私が知る限りほとんど使用されていません。
Andrew Wolfe

15

とても簡単です。

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

ユーザーには、異なるユーザーが所有するスキーマオブジェクトへのアクセス権が与えられます。


1
実際、混乱が生じるのは、人々が電話をかけたときです-ユーザーはスキーマです。あなたが説明したように、ユーザーはスキーマではないかもしれません。ユーザーは、他のユーザーのスキーマにアクセスするユーザーである可能性があります。
Sandeep Jindal

3

スキーマは、intrestのアイデア/ドメインに関するDB.objectsのカプセル化であり、1人のユーザーが所有しています。次に、役割が抑制された他のユーザー/アプリケーションによって共有されます。したがって、ユーザーはスキーマを所有する必要はありませんが、スキーマには所有者が必要です。


1

ユーザーアカウントは、家の鍵を持っている親戚のようなものですが、何も所有していません。つまり、ユーザーアカウントはデータベースオブジェクトを所有していません...データディクショナリはありません...

一方、スキーマはデータベースオブジェクトのカプセル化です。それは家のすべてを所有する家の所有者のようなものであり、ユーザーアカウントは所有者、つまりスキーマがそれに必要な許可を与えた場合にのみ家で商品にアクセスできます。


1

--USERおよびSCHEMA

ユーザーとスキーマの両方の単語は交換可能です。そのため、ほとんどの人が以下のこの単語について混乱するのはなぜですか。

--Userユーザーはデータベース(サーバー)に接続するためのアカウントです。CREATE USER user_name IDENTIFIED BY passwordを使用してユーザーを作成できます。

-スキーマ

実際には、Oracleデータベースには、データを処理するための論理的および物理的な構造が含まれています。スキーマは、データベース(メモリコンポーネント)内のデータを処理するための論理構造でもあります。ユーザーが作成したときにoracleによって自動的に作成されます。そのスキーマに関連付けられたユーザーが作成したすべてのオブジェクトが含まれます。たとえば、santhoshという名前のユーザーを作成した場合、oracleはsanthoshというスキーマを作成し、oracleはユーザーsanthoshが作成したすべてのオブジェクトをsanthoshに保存しますスキーマ。

CREATE SCHEMAステートメントでスキーマを作成できますが、Oracleはそのスキーマのユーザーを自動的に作成します。

DROP SCHEMA schama_name RESTRICTステートメントを使用してスキーマを削除できますが、スキーマが含まれているオブジェクトを削除することはできないため、スキーマを削除するには空である必要があります。

Oracleはユーザーがオブジェクトを含むオブジェクトを削除することを許可していないため、ユーザーのスキーマにオブジェクトを含むオブジェクトをドロップしようとする場合、CASCADEワードを指定する必要があります。DROP USER user_name CASCADEにより、oracleはスキーマ内のオブジェクトを削除し、ユーザーを自動的に削除します。このスキーマオブジェクトを参照するオブジェクトは、ビューやプライベートシノニムなどの他のスキーマから無効な状態になります。

私はあなたがそれらの間の違いを手に入れたことを願っています、このトピックに疑問がある場合は、遠慮なく尋ねてください。

ありがとうございました。


0

スキーマとデータベースのユーザーは同じですが、スキーマがデータベースオブジェクトを所有していて、ユーザーがオブジェクトにアクセスするだけでオブジェクトに何でもできる場合、スキーマユーザーが適切な権限を付与するまで、DDL操作を実行できません。


0

オラクルについての私の小さな知識に基づいて...ユーザーとスキーマはやや似ています。しかし、大きな違いもあります。「ユーザー」がオブジェクトを所有している場合、ユーザーはスキーマと呼ばれます。それ以外の場合は、「ユーザー」のままになります。USERが少なくとも1つのオブジェクトを所有すると、上記のすべての定義により、ユーザーはSCHEMAと呼ばれるようになります。


0

ユーザー:データベースのリソースへのアクセス。家に入る鍵のように。

スキーマ:データベースオブジェクトに関する情報のコレクション。この章に関する短い情報が含まれている本の索引のように。

詳細はこちら


0

MariaDBまたはMySQLに慣れているほとんどの人にとって、これは少し混乱しているようです。MariaDBまたはMySQLには異なるスキーマ(異なるテーブル、ビュー、PLSQLブロック、DBオブジェクトなどを含む)があり、USERSはそれらにアクセスできるアカウントだからです。スキーマ。したがって、特定のユーザーが特定のスキーマに属することはできません。そのスキーマに許可を与えることで、ユーザーはそのスキーマにアクセスできます。ユーザーとスキーマは、MySQLやMariaDBなどのデータベースで分離されています。

Oracleでは、スキーマとユーザーはほとんど同じように扱われます。そのスキーマを操作するには、スキーマ名がユーザー名に過ぎないと感じる場所にアクセス許可が必要です。スキーマ全体に権限を付与して、異なるスキーマの異なるデータベースオブジェクトにアクセスできます。オラクルでは、ユーザーがスキーマを所有していると言うことができます。ユーザーを作成すると、そのためのDBオブジェクトが作成され、その逆も同様です。


-1

スキーマはオブジェクトのコンテナです。ユーザーが所有しています。


1
これは、ユーザーが複数のスキーマを所有できることを意味します。それが可能であるとは信じていません(Oracleの場合)。ユーザーAはschemaに対する完全な管理者権限を持っている場合がありますがB、後者は常にそのようなユーザー名でログインするユーザーがBない場合でも、常にuser が所有します。

-1

さて、私は、データベースユーザーがDDL特権を持っている場合はスキーマであり、それ以外の場合はユーザーであるということをどこかで読みました。


これは実際には便利な区別です。CREATE特権を持つユーザーとCREATE特権がないユーザーとは異なります
Andrew Wolfe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.