Oracleのユーザーとスキーマの違いは何ですか?
Oracleのユーザーとスキーマの違いは何ですか?
回答:
スキーマは、ユーザーアカウントであり、その中のすべてのオブジェクトのコレクションを、すべての意図と目的のためのスキーマと見なす必要があります。
SCOTTは、さまざまな権限が付与されたEMP、DEPT、およびBONUSテーブルなどを含むスキーマです。
SYSは、大量のテーブル、ビュー、付与などを含むスキーマです。
SYSTEMはスキーマです。
技術的に-スキーマは、データベースで使用されるメタデータ(データディクショナリ)のセットであり、通常はDDLを使用して生成されます。スキーマは、テーブル、列、プロパティなど、データベースの属性を定義します。データベーススキーマは、データベース内のデータの記述です。
問題は、Oracleがスキーマという用語をそれが一般的に意味するものとは少し異なる方法で使用していることだと思います。
意味2のスキーマは類似していますが、意味1のスキーマと同じではありません。たとえば、複数のDBアカウントを使用するアプリケーションの場合、意味2のスキーマは複数のOracleスキーマで構成される可能性があります:-)。
プラススキーマは、他のコンテキスト(例:数学)で他のかなり関連のないものも意味します。
Oracleは、 "スキーマ"をオーバーロードする代わりに、 "userarea"や "accountobjects"のような用語を使用するだけで済みます...
WikiAnswersから:
さらに、ユーザーは、アクセス許可があれば、自分以外のスキーマのオブジェクトにアクセスできます。
通常どおりにユーザー(ログインしてシステム内の一部のオブジェクトにアクセスするためのユーザー名/パスワード)とスキーマをユーザーのホームディレクトリのデータベースバージョンとして考えます。ユーザー「foo」は通常、スキーマ「foo」の下に作成します。たとえば、ユーザー「foo」がテーブル「bar」を作成または参照する場合、Oracleはユーザーが「foo.bar」を意味すると想定します。
この回答は、所有者とスキーマの違いを定義するものではありませんが、議論に追加すると思います。
私の小さな思考の世界で:
私は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>
この方法は、アプリケーションユーザーがメインスキーマへの代替エントリポイントであり、独自のオブジェクトを必要としない場合に理想的です。
とても簡単です。
If USER has OBJECTS
then call it SCHEMA
else
call it USER
end if;
ユーザーには、異なるユーザーが所有するスキーマオブジェクトへのアクセス権が与えられます。
ユーザーアカウントは、家の鍵を持っている親戚のようなものですが、何も所有していません。つまり、ユーザーアカウントはデータベースオブジェクトを所有していません...データディクショナリはありません...
一方、スキーマはデータベースオブジェクトのカプセル化です。それは家のすべてを所有する家の所有者のようなものであり、ユーザーアカウントは所有者、つまりスキーマがそれに必要な許可を与えた場合にのみ家で商品にアクセスできます。
--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はスキーマ内のオブジェクトを削除し、ユーザーを自動的に削除します。このスキーマオブジェクトを参照するオブジェクトは、ビューやプライベートシノニムなどの他のスキーマから無効な状態になります。
私はあなたがそれらの間の違いを手に入れたことを願っています、このトピックに疑問がある場合は、遠慮なく尋ねてください。
ありがとうございました。
MariaDBまたはMySQLに慣れているほとんどの人にとって、これは少し混乱しているようです。MariaDBまたはMySQLには異なるスキーマ(異なるテーブル、ビュー、PLSQLブロック、DBオブジェクトなどを含む)があり、USERSはそれらにアクセスできるアカウントだからです。スキーマ。したがって、特定のユーザーが特定のスキーマに属することはできません。そのスキーマに許可を与えることで、ユーザーはそのスキーマにアクセスできます。ユーザーとスキーマは、MySQLやMariaDBなどのデータベースで分離されています。
Oracleでは、スキーマとユーザーはほとんど同じように扱われます。そのスキーマを操作するには、スキーマ名がユーザー名に過ぎないと感じる場所にアクセス許可が必要です。スキーマ全体に権限を付与して、異なるスキーマの異なるデータベースオブジェクトにアクセスできます。オラクルでは、ユーザーがスキーマを所有していると言うことができます。ユーザーを作成すると、そのためのDBオブジェクトが作成され、その逆も同様です。
さて、私は、データベースユーザーがDDL特権を持っている場合はスキーマであり、それ以外の場合はユーザーであるということをどこかで読みました。