他のスキーマオブジェクトの作成

テーブルとは別に、他の重要なスキーマオブジェクトは、ビュー、シーケンス、インデックス、およびシノニムです。ビューは、論理テーブルまたは仮想テーブルです。シノニムは、データベースオブジェクトの単なるエイリアス名です。シノニムは、データベースオブジェクトの実際の名前を偽装することで、クエリの記述を簡素化し、システムセキュリティの要素を提供します。シーケンスは、整数値の自動生成をサポートする特別なデータベースオブジェクトであり、多くの場合、テーブルの主キー値を生成します。インデックスはテーブルの列に作成され、テーブルからの情報の迅速な取得を容易にします。

ビュー

データベースビューは、クエリに基づく論理テーブルまたは仮想テーブルです。ビューはテーブルと同じようにクエリされます。つまり、開発者としての観点から、またはデータベースシステムユーザーの観点からは、ビューはテーブルのように見えます。ビューの定義オブジェクトはデータベースのデータディクショナリ内に格納されているため。ただし、ビューにはデータ自体は格納されません。データベースには、ビューを作成するための実行プランも格納されます。つまり、ビューのSELECTクエリによって提示された実際のデータが格納されていなくても、ビューを使用してデータを迅速に取得できます。ビューの一部として。むしろ、ビューが定義されているデータベーステーブルからビューがクエリされるたびにデータが「収集」されます。これらはベーステーブルと呼ばれます。

一般的な構文を以下に示します。

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW [ViewName]
[(Column Alias Name...)] 
AS [Query]
[WITH [CHECK OPTION] [READ ONLY] [CONSTRAINT]];

構文から、

FORCEオプションを使用すると、ビューが参照するベーステーブルがまだ存在しない場合でも、ビューを作成できます。このオプションは、ベーステーブルと付随するデータを実際に作成する前にビューを作成するために使用されます。

NOFORCEオプションはFORCEの反対であり、システムユーザーがビューを作成するために必要な特権を持っていて、ビューの作成元のテーブルがすでに存在する場合に、ビューを作成できます。これはデフォルトのオプションです。

WITH READ ONLYオプションを使用すると、読み取り専用のビューを作成できます。DELETE、INSERT、またはUPDATEコマンドを使用して、読み取り専用ビューのデータを変更することはできません。

WITH CHECK OPTION句を使用すると、ビューから選択できる行を更新できます。また、値の制約を指定することもできます。CONSTRAINT句は、WITH CHECK OPTION句と連携して機能し、データベース管理者が一意の名前を割り当てることができます。データベース管理者がCONSTRAINT句を省略した場合、Oracleは、あまり意味のないシステム生成の名前を制約に自動的に割り当てます。

ビューの種類

単純なビューは、1つのテーブルの上にのみ作成されます。これは、関数やグループ句を含まない単純なSELECTクエリですが、変換せずにテーブルから列を選択するだけです。ビューでDMLを実行すると、すぐに反映されます。ベーステーブルで。

複合ビューは、結合を使用して複数のテーブルに作成されます。SQL関数、Group by関数を含めることができます。ただし、ビューは複数のデータにあり、列の選択も簡単ではないため、DML操作は許可されません。

Simple View: 以下の簡単なビューでは、JOB IDがDEVである従業員の従業員名、部門ID、および給与を選択します。

CREATE OR REPLACE VIEW v_emp_dev
AS
SELECT first_name, department_id, salary
FROM employees
WHERE job_id = 'DEV';

Complex view: 次の例は、部門名、部門で引き出された平均給与、および部門で働いている従業員の数を示しています。

CREATE OR REPLACE VIEW EMP_VU
AS
SELECT department_name, AVG (salary) avg_sal, COUNT (first_name) count
FROM employees E, departments D
WHERE E.department_id = D.department_id
GROUP BY department_name;

DESCRIBE [view name]ビュー構造について説明します。列は、ビュー定義と同じ順序でリストされます。

ビューでのDML操作

DML操作は、単純なビューで簡単に実行できます。前述のように、挿入、更新、および削除の操作は、実際にはベーステーブルで行われます。

ビューでUPDATE、DELETE、またはINSERT DMLステートメントを実行すると、実際には、ビューが定義されている1つまたは複数のベーステーブルのデータ行を操作します。UPDATE、DELETE、およびINSERTステートメントの使用には制限があります。まず、ビューでUPDATE、DELETE、またはINSERTステートメントを使用するには、ビューが更新可能である必要があります。SELECT句でSELECTリストに集計関数が指定されていない場合、ビューは更新可能です。さらに、ビューは更新できませんでした。 GROUP BY、DISTINCT、またはUNION句を使用して作成されています。FROM句のSELECTサブクエリで集計関数を使用することは許可されています。また、ビューのSELECTリストに派生列を含めることはできません。次に、JOIN操作(結合ビュー)の結果としてビューが作成された場合、UPDATEステートメントとINSERTステートメントは、一度に1つのベーステーブルにのみ行を変更または挿入できます。単一のデータ操作言語(DML)ステートメントで2つ以上のテーブルの行を変更することはできません。最後に、DELETEステートメントは、テーブルがFROM句で参照されている場合にのみビューに対して実行できます。これは単に、指定されていないテーブルから行を削除できないことを意味します。

WITH CHECKOPTION句

WITH CHECK OPTIONは、ビューを介してデータを挿入または更新するときに実行するチェックのレベルを指定するオプションの句です。WITHCHECKOPTION句を使用してビューを作成する場合、ビューを介してベーステーブルに挿入または更新されるすべての行ビュー定義に準拠する必要があります。ビューが読み取り専用として作成されている場合、このオプションは指定できないことに注意してください。

たとえば、ビューV_EMP_DEVは、開発者である従業員用に作成されます(JOB_ID = DEV)。

CREATE OR REPLACE VIEW v_emp_dev
AS
SELECT first_name, department_id, salary, 
FROM employees
WHERE job_id = 'DEV'
WITH CHECK OPTION empvu_dev;

ユーザーがビューを介して人事部の従業員の給与を更新しようとしましたが、例外が発生しました。これは、ビューがCHECKOPTIONで作成されたためです。

UPDATE v_emp_dev
SET salary = salary+500
WHERE JOB_ID = 'HR';
ORA-01402: view WITH CHECK OPTION where-clause violation

単純なビューであれば、UPDATEステートメントは例外を発生させませんでした。

ビューを削除する

データベース管理者(DBA)またはビュー所有者は、DROP VIEWステートメントを使用してビューを削除できます。ビューに制約が定義されている場合は、ビューを削除するときにCASCADECONSTRAINTS句を指定する必要があります。それ以外の場合、DROP VIEWステートメントは処理に失敗します。別のビューまたはシノニムやマテリアライズドビューなどの他のデータベースオブジェクト(これらのオブジェクトは両方ともこの章の後半で説明します)がドロップされたビューを参照する場合、Oracleはこれらのデータベースオブジェクトをドロップしません。むしろ、Oracleはそれらを無効としてマークします。これらの無効なオブジェクトを削除するか、再定義して、再び有効にすることができます。

以下のDROPVIEWコマンドは、ビューEMP_VUをデータベースから削除します。

DROP VIEW EMP_VU;

シーケンス

Oracleは、このタイプの使用のために一意の番号のシーケンスを生成する機能を提供し、それらはシーケンスと呼ばれます。一般に、シーケンスは、データベーステーブルのプライマリキー値として使用される一意の連続した整数値を生成するために使用されます。昇順または降順で生成されます。シーケンスによって一度生成された番号はロールバックできないことに注意してください。

構文

CREATE SEQUENCE <sequence name>
[INCREMENT BY < number >]
[START WITH < start value number>]
[MAXVALUE < MAXIMUM VLAUE NUMBER>]
[NOMAXVALUE]
[MINVALUE < minimum value number>]
[CYCLE | NOCYCLE]
[CACHE < number of sequence value to cache> | NOCACHE]
[ORDER | NOORDER];

構文から、

CREATE SEQUENCEステートメントは、一意のシーケンス名を指定する必要があります。これは、ステートメントで必要な唯一の句です。他の句を指定しない場合、生成されるすべてのシーケンス番号はOracleのデフォルト設定に従います。

INCREMENT BY句は、各数値が生成されるときにシーケンスがどのようにインクリメントするかを決定します。デフォルトの増分は1です。ただし、シーケンスが数値をスキップする正当な理由がある場合は、別の増分を指定できます。正の数値増分は、選択した間隔に等しい間隔で昇順のシーケンス番号を生成します。負の数値増分は、降順のシーケンス番号を生成します。

START WITH句は、シーケンスの開始数値を指定します-デフォルトの開始番号は1です。さらに、シーケンス値を格納する列にデータを含む行がすでにある場合は、開始値を指定する必要があります。

MAXVALUE句は、シーケンスをインクリメントできる最大値を指定します。MAXVALUEがない場合、シーケンスに対して生成できる最大許容値は非常に大きく、10の27乗-1です。デフォルトはNOMAXVALUEです。

MINVALUE句は、デクリメントシーケンス(降順で数値を生成するシーケンス)のシーケンスの最小値を指定します。デフォルトはNOMINVALUEです。

CYCLE句は、シーケンスが指定されたMAXVALUEに達した場合に、シーケンス値を再利用できることを指定します。シーケンスが循環する場合、数値はSTARTWITH値から再開して生成されます。

CACHE句は、Oracleがキャッシュメモリに格納されるシーケンス番号の指定されたバッチを生成できるようにすることで、システムパフォーマンスを向上させることができます。

番号を指定せずにCACHEを指定した場合、デフォルトのキャッシュサイズは20シーケンス番号です。オプションで、NOCACHEを指定して、シーケンス番号のキャッシュを防ぐことができます。

ORDER句は、シーケンス番号が要求された正確な時系列で割り当てられることを指定します。

NEXTVALとCURRVAL

シーケンス値は、currvalとnextvalという名前の2つの疑似列を使用して生成されます。疑似列はテーブル列のように動作しますが、疑似列は実際にはテーブルに格納されません。nextval疑似列を初めて選択したときの初期値は、シーケンスが返されます。nextval疑似列を後で選択すると、INCREMENT BY句で指定されているようにシーケンスがインクリメントされ、新しく生成されたシーケンス値が返されます。currval疑似列は、シーケンスの現在の値を返します。これは、によって返される値です。 nextvalへの最後の参照。

セッションでは、CURRVALではなくNEXTVALがシーケンスの最初のアクションである必要があります。これは、セッションで、NEXTVALがシーケンスからセッションの最初の番号を生成するときに、Oracleが現在の値をCURRVALに保持するためです。

構文:

Sequence.NEXTVAL
Sequence.CURRVAL

注意点-

  • CURRVALおよびNEXTVALは、selectステートメントの外部SQLでのみ使用できます。

  • CURRVALおよびNEXTVALは、INSERTステートメントで使用して、列の主キーを置き換えることができます。これは、サブクエリ句としてもVALUES句としても使用できます。

  • CURRVALおよびNEXTVALを使用して、テーブルの値を更新できます。

  • CURRVALおよびNEXTVALは、DISTINCTキーワード、GROUP BY、HAVING、またはORDER BY句、およびCREATETABLEまたはALTERTABLEステートメントのDEFAULT式を使用してVIEW選択リストに含めることはできません。

シーケンスの変更

シーケンスの所有者は、シーケンスを変更して、INCREMENT BY値、MINVALUE、MAXVALUE、CYCLE、またはCACHE句などの属性のみを変更できます。行われた変更は、今後の数値に反映されることに注意してください。

構文:

ALTER SEQUENCE [sequence name]
INCREMENT BY n
MAXVALUE n
NOCACHE
NOCYCLE

シーケンスの削除

DROP SEQUENCEコマンドは、再作成が必要なシーケンス、または不要になったシーケンスを削除します。

DROP SEQUENCE [sequence name]

インデックス

インデックスは、SELECTクエリのパフォーマンスを調整するために使用されるデータベースオブジェクトです。インデックスには、プライマリキー制約の適用に使用されるもの、一意のインデックス、一意でないインデックス、連結インデックスなど、さまざまな種類があります。インデックスがない場合、クエリでは、結果テーブルに必要な行を返すために、Oracleがテーブル内のすべての行をスキャンする必要があります。インデックスはテーブル列に作成され、インデックスセグメントの下に列のすべての値が格納されます。シーケンスとは異なり、インデックスはテーブルです。テーブルが削除されると、それらは自動的に削除されます。

索引は自動または手動で作成できます。PRIMARYKEY制約またはUNIQUE制約を指定すると、Oracleは、指定された表の迅速なデータ検索をサポートするために、一意の索引を自動的に作成します。

または、ユーザーが手動でインデックスを作成して、クエリのパフォーマンスを最適化することもできます。手動で作成されたインデックスは、一意または非一意にすることができます。一意でないインデックスは、Bツリー、ビットマップ、または関数ベースのインデックスです。デフォルトでは、Oracleは列にBツリーインデックスを作成します。構文は次のとおりです

構文

CREATE [UNIQUE][BITMAP]INDEX index
ON table (column [, column]...);

UNIQUEおよびBITMAPは、一意のビットマップインデックスに対してのみ指定する必要があることに注意してください。デフォルトでは、Oracleは通常のインデックスに対してBツリーインデックスを作成します。

複合インデックス(連結インデックスとも呼ばれます)は、テーブルの複数の列に作成されるインデックスです。複合インデックスの列は任意の順序で表示でき、テーブル内の隣接する列である必要はありません。複合インデックスは、WHERE句が複合インデックスの列のすべてまたは先頭部分を参照するクエリの行取得速度を向上させます。インデックスには最大32列を含めることができます。

たとえば、ユーザーはEMPLOYEESテーブルのHIRE_DATE列にインデックスIDX_EMPを作成します。インデックスの使用により、インデックス付きパススキャンをトラバースしてディスクI / Oを削減し、HIRE_DATE列でフィルタリングされたデータを見つけます。

CREATE INDEX IDX_EMP ON employees(hire_date);

インデックスを削除する

インデックスは変更できませんが、分析、再構築、または統計計算の目的で変更できます。インデックス定義を変更する必要がある場合は、削除して再作成する必要があります。DROPINDEXコマンドの構文は単純です。

DROP INDEX index_name;

同義語

同義語はエイリアス、つまりデータベースオブジェクトを参照するタスクを簡略化するために使用される省略形です。概念は友人や知人のニックネームの使用に類似しています。別のユーザーが所有するオブジェクトを参照するには、スキーマ名が必要です。接頭辞を付けます。シノニムを使用すると、スキーマ名とともにオブジェクトを参照する手間が省けます。このように、シノニム名は実際のオブジェクト名とその所有者を非表示にするため、シノニムは場所の透過性を提供します。

シノニムには、パブリックとプライベートの2つのカテゴリがあります。パブリックシノニムを使用すると、すべてのシステムユーザーがオブジェクトに簡単にアクセスできます。実際、パブリックシノニムを作成する個人はシノニムを所有しません-むしろ、オラクル内に存在するPUBLICユーザーグループに属します。一方、プライベートシノニムは、それらを作成してそこに常駐するシステムユーザーに属します。ユーザーのスキーマ。

構文

CREATE [PUBLIC] SYNONYM [synonym name] 
FOR OBJECT;

システムユーザーは、自分が所有するプライベートシノニムを使用する特権を他のシステムユーザーに付与できます。シノニムを作成するには、CREATE SYNONYM特権が必要です。さらに、パブリックシノニムを作成するには、CREATE PUBLICSYNONYM特権が必要です。シノニムがパブリックとして宣言されている場合、シノニム名をパブリックシノニムとして使用することはできません。すでに存在するパブリックシノニムを作成しようとすると、CREATE PUBLIC SYNONYMコマンドが失敗し、OracleはORA-00955を返します。 nameは、既存のオブジェクトエラーメッセージですでに使用されています。

2人のユーザーU1とU2.U1がEMPLOYEESテーブルにアクセスできるとします。したがって、EMPLOYEESテーブルからU2へのアクセスも有効にするために、U2スキーマにシノニムを作成できます。U1からU2へのアクセスを許可する必要があります。

CONN U2/U2
SQL> CREATE SYNONYM EMP_SYN	FOR U1.employees;

CONN U1/U1
SQL> GRANT ALL ON EMP_SYN TO U2;

CONN U2/U2
SQL> SELECT * FROM EMP_SYN;

同義語を削除する

uerは、所有している同義語を削除できます。パブリックシノニムを削除するには、DROP PUBLICSYNONYM特権が必要です。

DROP SYNONYM EMP_SYN;