この章の内容は、次のとおりです。
ここでは、ビューを管理する方法について説明します。この項の内容は、次のとおりです。
ビューとは、表または表の組合せの論理表現です。本質的には、ビューは格納された問合せです。ビューのデータは、そのビューの基礎となる表から生成されます。この表を実表と呼びます。実表は、実際の表の場合もビュー自体の場合もあります。ビューに対して実行するすべての操作は、実際にはビューの実表に影響します。ビューの使用方法は、表の場合とほぼ同じです。通常の表と同様に、ビューに対する問合せ、更新、挿入および削除ができます。
ビューによって、他の表およびビューに常駐するデータの様々な表現(サブセットまたはスーパーセットなど)が可能です。ビューを使用すると、ユーザーの必要にあわせて調整したデータ表現ができます。
注意: ビューの1つの特殊なタイプがエディショニング・ビューで、エディションに基づく再定義を使用したオンラインでのアプリケーションのアップグレードをサポートするためにのみ使用されるビューです。ビューの管理に関する項のここからは、エディショニング・ビューを除くすべてのビューについて説明します。エディショニング・ビューおよびエディションに基づく再定義の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。 |
関連項目: ビューの概要については、『Oracle Database概要』を参照してください。 |
自分のスキーマに新しいビューを作成するには、CREATE VIEW
システム権限が必要です。別のユーザーのスキーマ内にビューを作成するには、CREATE ANY VIEW
システム権限が必要です。これらの権限は明示的に取得するか、またはロールを介して取得できます。
どのスキーマのビューであっても、その所有者は、ビュー定義で参照されるすべてのオブジェクトにアクセスする権限を明示的に付与されている必要があります。所有者がロールを介してこれらの権限を取得することはできません。また、ビューの機能は、ビューの所有者の権限によって決まります。たとえば、ビューの所有者にScottのemp
表のINSERT
権限しかない場合、emp
表に新しい行を挿入するためにはビューを使用できますが、このビューの行を選択(SELECT
)、更新(UPDATE
)または削除(DELETE
)するためには使用できません。
ビューの所有者がビューにアクセスする権限を他のユーザーに付与しようとする場合は、ベース・オブジェクトに対するGRANT OPTION
付きのオブジェクト権限、またはADMIN OPTION
付きのシステム権限が必要です。
ビューを作成するには、CREATE VIEW
文を使用します。ビューはそれぞれ、表、マテリアライズド・ビューまたは他のビューを参照する問合せによって定義されます。すべての副問合せと同様に、ビューを定義する問合せには、FOR UPDATE
句を指定できません。
次の文は、emp
表のデータのサブセットに対してビューを作成します。
CREATE VIEW sales_staff AS SELECT empno, ename, deptno FROM emp WHERE deptno = 10 WITH CHECK OPTION CONSTRAINT sales_staff_cnst;
sales_staff
ビューを定義する問合せは、部門番号10の行のみを参照します。また、CHECK OPTION
は、そのビューが選択できない行に対してINSERT
文およびUPDATE
文を発行できないという制約(sales_staff_cnst
)付きでビューを作成します。たとえば、次のINSERT
文では、sales_staff
ビュー(部門番号が10の行のみを含む)を使用してemp
表に行が正常に挿入されます。
INSERT INTO sales_staff VALUES (7584, 'OSTER', 10);
しかし、次のINSERT
文は、sales_staff
ビューを使用しても選択できない部門番号30の行を挿入しようとしているため、エラーが返されます。
INSERT INTO sales_staff VALUES (7591, 'WILLIAMS', 30);
WITH READ ONLY
句を指定してビューを作成できますが、これにより、このビューからは、実表の更新、挿入または削除ができなくなります。WITH
句を指定しない場合、一部の制限を伴いますが、ビューは従来どおり更新可能です。
関連項目: CREATE VIEW文の構文とセマンティクスの詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
FROM
句で複数の実表またはビューを指定するビューを作成することもできます。この種のビューを結合ビューと呼びます。次の文は、emp
表とdept
表のデータを結合するdivision1_staff
ビューを作成します。
CREATE VIEW division1_staff AS SELECT ename, empno, job, dname FROM emp, dept WHERE emp.deptno IN (10, 30) AND emp.deptno = dept.deptno;
更新可能な結合ビューは、UPDATE
、INSERT
およびDELETE
操作が可能な結合ビューです。詳細は、「結合ビューの更新」を参照してください。
ビューが作成されるときに、Oracle Databaseは最上位のビュー問合せのワイルドカード(*)を列リストに展開します。結果の問合せデータ・ディクショナリに格納され、副問合せはそのまま残されます。展開された列リスト中の列名は引用符で囲まれており、これは、ベース・オブジェクトの列がもともと引用符付きで入力された可能性があり、問合せの構文を正しいものにするためには引用符が必要であることを示しています。
たとえば、dept
ビューが次のように作成される場合を想定します。
CREATE VIEW dept AS SELECT * FROM scott.dept;
データベースは、dept
ビューを定義している問合せを次のように格納します。
SELECT "DEPTNO", "DNAME", "LOC" FROM scott.dept;
エラー付きで作成されたビューでは、ワイルドカードは展開されません。エラーなしでビューがコンパイルされると、定義された問合せのワイルドカードが展開されます。
CREATE VIEW
文に構文エラーがない場合は、そのビューを定義している問合せを実行できなくても、データベースはビューを作成できます。この場合、ビューは、エラー付きで作成されたとみなされます。たとえば、存在しない表や既存の表の無効な列を参照するビューを作成するとき、またはビューの所有者が必要な権限を持っていないときでも、ビューを作成し、データ・ディクショナリに登録できます。ただし、そのビューは使用できません。
エラー付きのビューを作成するには、CREATE VIEW
文のFORCE
句を指定する必要があります。
CREATE FORCE VIEW AS ...;
デフォルトでは、エラー付きのビューはINVALID
として作成されます。このようなビューを作成しようとすると、ビューがエラー付きで作成されたことを示すメッセージが返されます。状況が変化して無効なビューの問合せが実行可能になると、ビューは再コンパイルされ、有効(使用可能)になります。条件の変更とビューに及ぼす影響の詳細は、「オブジェクト依存性の管理」を参照してください。
ビューを置換するには、ビューの削除および作成に必要なすべての権限が必要です。ビューの定義を変更する場合は、そのビューを置換する必要があり、ビューの定義の変更にALTER VIEW
文は使用できません。次の方法でビューを置換できます。
ビューを削除してから再作成します。
注意: ビューを削除するときに、ロールおよびユーザーに付与された対応するオブジェクト権限はすべて取り消されます。ビューを再作成してから、再度権限を付与してください。 |
OR REPLACE
句を含むCREATE VIEW
文によって、ビューを再定義します。OR REPLACE
句は、ビューの現行の定義を置換し、現行のセキュリティ認可を保存します。たとえば、前述のように、sales_staff
ビューを作成し、いくつかのオブジェクト権限をロールと他のユーザーに付与した場合を想定します。ただし、ここではsales_staff
ビューを再定義して、WHERE
句に指定されている部門番号を変更するものとします。この場合は、次の文によって、sales_staff
ビューの現行バージョンを置換できます。
CREATE OR REPLACE VIEW sales_staff AS SELECT empno, ename, deptno FROM emp WHERE deptno = 30 WITH CHECK OPTION CONSTRAINT sales_staff_cnst;
ビューを置換する前に、次の影響を検討してください。
ビューを置換することによって、データ・ディクショナリ内のビュー定義が置換されます。ビューによって参照される基礎となるオブジェクトは影響を受けません。
前のビューにはCHECK OPTION
で制約を定義していたが、新しいビュー定義には指定しない場合、その制約は削除されます。
置換されたビューに依存しているビューはすべて無効(使用不可)になります。また、ビューの新しいバージョンでの変更内容によっては、依存しているPL/SQLプログラム・ユニットも無効になる場合があります。たとえば、ビューのWHERE
句のみが変更された場合、依存しているPL/SQLプログラム・ユニットは有効のままです。ただし、ビューの列数、列名またはデータ型が変更された場合は、依存しているPL/SQLプログラム・ユニットも無効になります。データベースによる依存性管理の詳細は、「オブジェクト依存性の管理」を参照してください。
ビューに対して問合せを発行したり、INSERT
、UPDATE
またはDELETE
文を発行するためには、そのビューに対するSELECT
、INSERT
、UPDATE
またはDELETE
の各オブジェクト権限を、明示的にまたはロールを介して持っている必要があります。
ビューは、表と同じ方法で問い合せることができます。たとえば、Division1_staff
ビューを問い合せるには、そのビューを参照する有効なSELECT
文を入力します。
SELECT * FROM Division1_staff; ENAME EMPNO JOB DNAME ------------------------------------------------------ CLARK 7782 MANAGER ACCOUNTING KING 7839 PRESIDENT ACCOUNTING MILLER 7934 CLERK ACCOUNTING ALLEN 7499 SALESMAN SALES WARD 7521 SALESMAN SALES JAMES 7900 CLERK SALES TURNER 7844 SALESMAN SALES MARTIN 7654 SALESMAN SALES BLAKE 7698 MANAGER SALES
一部の制限を伴いますが、ビューを使用して、実表に対する行の挿入、更新または削除ができます。次の文は、sales_staff
ビューを使用してemp
表に新しい行を挿入します。
INSERT INTO sales_staff VALUES (7954, 'OSTER', 30);
ビューに対するDML操作の制限では、次の基準がリストされている順に適用されます。
ビューの定義にSET
またはDISTINCT
演算子、GROUP
BY
句またはグループ関数を含む問合せが使用されている場合、そのビューによる実表への行の挿入、更新または削除はできません。
ビューの定義にWITH
CHECK
OPTION
が使用されていて、行を実表から選択できない場合、そのビューによる実表への行の挿入または更新はできません。
DEFAULT
句を持たないNOT
NULL
列がビューから省略されている場合、そのビューによる実表への行の挿入はできません。
ビューの作成にDECODE(deptno, 10, "SALES", ...)
のような式が使用されている場合、そのビューによる実表への行の挿入または更新はできません。
sales_staff
ビューのWITH
CHECK
OPTION
で作成された制約によって許可されるのは、部門番号30を持つ行のemp
表への挿入または更新のみです。一方、次の文(つまり、deptno
列を除外する)でsales_staff
ビューが定義されるとします。
CREATE VIEW sales_staff AS SELECT empno, ename FROM emp WHERE deptno = 10 WITH CHECK OPTION CONSTRAINT sales_staff_cnst;
このビュー定義を検討すると、既存のレコードのempno
またはename
フィールドは更新できますが、ビューではdeptno
フィールドを変更できないため、sales_staff
ビューを介してemp
表に行を挿入することはできません。deptno
フィールドにDEFAULT
値10を定義していた場合は、挿入を実行できます。
ユーザーが無効なビューを参照しようとすると、次のエラー・メッセージが返されます。
ORA-04063: view 'view_name' has errors
このエラー・メッセージが返されるのは、ビューは存在しているが、問合せのエラーが原因で使用禁止状態の場合です(このビューが最初に作成されたときにあったエラーか、またはビューは正常に作成されたが、基礎となるオブジェクトが変更または削除されたために、後で使用禁止状態になったかは関係ありません)。
更新可能な結合ビュー(変更可能な結合ビューと呼ぶこともあります)とは、SELECT
文の最上位のFROM
句に複数の表を含むビューで、WITH READ ONLY
句の制限を受けないものです。
更新可能な結合ビューに関する規則を次の表に示します。これらの基準を満たすビューは、従来どおり更新可能とみなされます。
規則 | 説明 |
---|---|
一般規則 | 結合ビューに対するINSERT 、UPDATE またはDELETE 操作は、基礎となる実表を一度に1つしか変更できません。 |
UPDATE 規則 |
結合ビューの更新可能な列はすべて、キー保存表の列にマップする必要があります。キー保存表については、「キー保存表」を参照してください。ビューの定義にWITH CHECK OPTION 句が使用されている場合は、すべての結合列および繰返し表の列はいずれも更新できません。 |
DELETE 規則 |
結合の中にキー保存表が1つしかない場合には、結合ビューから行を削除できます。このキー保存表は、FROM 句で繰り返すことができます。ビューの定義にWITH CHECK OPTION 句が使用されていて、キー保存表が繰り返される場合は、そのビューから行を削除できません。 |
INSERT 規則 |
INSERT 文では、明示的にも暗黙的にも非キー保存表の列を参照しないでください。結合ビューの定義にWITH CHECK OPTION 句が使用されている場合は、INSERT 文を使用できません。 |
結合ビュー内の列が従来どおり更新可能かどうかを示すデータ・ディクショナリ・ビューがあります。これらのビューの詳細は、「UPDATABLE_COLUMNSビューの使用」を参照してください。
注意: 結合ビューが従来どおり更新可能かどうかについては、いくつかのその他の制限と条件が影響します。これらの制限と条件については、 『Oracle Database SQL言語リファレンス』のCREATE VIEW文の説明を参照してください。
ビューが従来どおり更新可能でない場合は、そのビューに また、ビューが別のネストされたビュー上の結合である場合は、そのネストされたビューをトップレベル・ビューにマージ可能である必要があります。マージ可能なビューとマージ不可能なビューの詳細、およびオプティマイザによってビューを参照する文が最適化される方法の概要は、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。 |
ここでは、従来どおり更新可能な結合ビューの規則の例を示し、キー保存表について説明します。それぞれの例は、表に主キーと外部キーを明示的に定義した場合、または一意索引を定義した場合にのみ動作します。次の文は、emp
およびdept
の制約が適切に設定された表定義を作成します。
CREATE TABLE dept ( deptno NUMBER(4) PRIMARY KEY, dname VARCHAR2(14), loc VARCHAR2(13)); CREATE TABLE emp ( empno NUMBER(4) PRIMARY KEY, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2), FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO));
また、前述の例の主キーと外部キーの制約を省略し、dept(deptno)
にUNIQUE INDEX
を作成した場合でも、後続の例は動作可能です。
次の文は、例で参照されるemp_dept
結合ビューを作成します。
CREATE VIEW emp_dept AS SELECT emp.empno, emp.ename, emp.deptno, emp.sal, dept.dname, dept.loc FROM emp, dept WHERE emp.deptno = dept.deptno AND dept.loc IN ('DALLAS', 'NEW YORK', 'BOSTON');
キー保存表の概念は、結合ビューを更新するうえでの制限を理解するために重要です。表のすべてのキーが結合の結果のキーでもある場合、その表はキー保存になります。つまり、キー保存表とは、結合後もそのキーを保存している表のことです。
注意: 表をキー保存にするために、表の1つ以上のキーを選択する必要はありません。1つ以上のキーを選択した場合に、そのキーが結合の結果のキーであれば十分です。 |
表のキー保存特性は、表内の実際のデータには依存しません。これは、そのスキーマの特性です。たとえば、emp
表で各部門に多くても1人の従業員しか含まれていない場合、emp
とdept
の結合の結果ではdeptno
は一意ですが、dept
はキー保存表ではありません。
emp_dept
からすべての行を選択すると、結果は次のようになります。
EMPNO ENAME DEPTNO DNAME LOC ---------- ---------- ------- -------------- ----------- 7782 CLARK 10 ACCOUNTING NEW YORK 7839 KING 10 ACCOUNTING NEW YORK 7934 MILLER 10 ACCOUNTING NEW YORK 7369 SMITH 20 RESEARCH DALLAS 7876 ADAMS 20 RESEARCH DALLAS 7902 FORD 20 RESEARCH DALLAS 7788 SCOTT 20 RESEARCH DALLAS 7566 JONES 20 RESEARCH DALLAS 8 rows selected.
このビューでは、empno
がemp
表のキー、および結合の結果のキーでもあるため、emp
がキー保存表です。deptno
はdept表のキーですが、結合のキーではないため、dept
はキー保存表ではありません
。
一般規則では、結合ビューにおいて、UPDATE
、INSERT
またはDELETE
文では、基礎となる実表を1つしか変更できません。以降の例は、UPDATE
、DELETE
およびINSERT
文に固有の規則を示しています。
次の例は、emp_dept
ビューを正常に変更するUPDATE
文を示したものです。
UPDATE emp_dept SET sal = sal * 1.10 WHERE deptno = 10;
次に示すUPDATE
文は、emp_dept
ビューには使用できません。
UPDATE emp_dept SET loc = 'BOSTON' WHERE ename = 'SMITH';
この文はdept
実表を変更しようとしますが、dept
表はemp_dept
ビューのキー保存表でないため、エラー番号ORA-01779
「キー保存されていない表にマップする列は変更できません
」が出力され、文を実行できません。
一般に、結合ビューの更新可能な列はすべて、キー保存表の列にマップする必要があります。ビューの定義にWITH CHECK OPTION
句が使用されている場合は、すべての結合列およびビューで2回以上参照されている表から取得したすべての列はいずれも更新できません。
したがって、たとえばemp_dept
ビューの定義にWITH CHECK OPTION
が使用されている場合、次に示すUPDATE
文は失敗します。
UPDATE emp_dept SET deptno = 10 WHERE ename = 'SMITH';
結合列を更新しようとするため、この文は失敗となります。
関連項目: UPDATE文の構文と詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
結合の中にキー保存表が1つしかない場合には、結合ビューから削除できます。このキー保存表は、FROM
句で繰り返すことができます。
次のDELETE
文は、emp_dept
ビューに対して動作します。
DELETE FROM emp_dept WHERE ename = 'SMITH';
emp_dept
ビューに対するこのDELETE
文は、実表emp
に対するDELETE
操作に変換でき、表emp
は結合ビュー内の唯一のキー保存表であるため、この文は有効です。
次のビューでは、2つのキー保存表がありますが、同じ表であるため、DELETE
操作を実行できます。つまり、キー保存表が繰り返されています。この場合、この削除文は、FROM
リストの最初の表(この例では、e1
)で操作されます。
CREATE VIEW emp_emp AS SELECT e1.ename, e2.empno, e2.deptno FROM emp e1, emp e2 WHERE e1.empno = e2.empno;
ビューの定義にWITH CHECK OPTION
句が使用されていて、キー保存表が繰り返される場合は、そのビューから行を削除できません。
CREATE VIEW emp_mgr AS SELECT e1.ename, e2.ename mname FROM emp e1, emp e2 WHERE e1.mgr = e2.empno WITH CHECK OPTION;
関連項目: DELETE文の構文と詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
emp_dept
ビューに対する次のINSERT
文は正常に動作します。
INSERT INTO emp_dept (ename, empno, deptno) VALUES ('KURODA', 9010, 40);
変更されるキー保存実表は1つのみであり(emp
)、40はdept
表の有効なdeptno
であるため(つまり、emp
表に対するFOREIGN KEY
整合性制約を満たすため)、この文は動作します。
次のINSERT
文は、実表emp
に対するUPDATE
が失敗するのと同じ理由で失敗します。つまり、77というdeptno
が存在しないため、emp
表に対するFOREIGN KEY
整合性制約に違反します。
INSERT INTO emp_dept (ename, empno, deptno) VALUES ('KURODA', 9010, 77);
次のINSERT
文はエラー番号ORA-01776
「結合ビューを介して複数の実表を変更できません。
」が出力されて失敗します。
INSERT INTO emp_dept (empno, ename, loc) VALUES (9010, 'KURODA', 'BOSTON');
INSERT
は、暗黙的にも明示的にも、非キー保存表の列を参照できません。結合ビューの定義にWITH CHECK OPTION
句が使用されている場合は、その結合ビューに対してINSERT
を実行できません。
関連項目: INSERT文の構文と詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
外部結合が含まれるビューは、変更可能な場合もあります。次に例を示します。
CREATE VIEW emp_dept_oj1 AS SELECT empno, ename, e.deptno, dname, loc FROM emp e, dept d WHERE e.deptno = d.deptno (+);
文:
SELECT * FROM emp_dept_oj1;
結果:
EMPNO ENAME DEPTNO DNAME LOC ------- ---------- ------- -------------- ------------- 7369 SMITH 40 OPERATIONS BOSTON 7499 ALLEN 30 SALES CHICAGO 7566 JONES 20 RESEARCH DALLAS 7654 MARTIN 30 SALES CHICAGO 7698 BLAKE 30 SALES CHICAGO 7782 CLARK 10 ACCOUNTING NEW YORK 7788 SCOTT 20 RESEARCH DALLAS 7839 KING 10 ACCOUNTING NEW YORK 7844 TURNER 30 SALES CHICAGO 7876 ADAMS 20 RESEARCH DALLAS 7900 JAMES 30 SALES CHICAGO 7902 FORD 20 RESEARCH DALLAS 7934 MILLER 10 ACCOUNTING NEW YORK 7521 WARD 30 SALES CHICAGO 14 rows selected.
emp_dept_oj1
のemp
実表の列は、emp
が結合の中のキー保存表であるため、ビューを介して変更可能です。
CREATE VIEW emp_dept_oj2 AS SELECT e.empno, e.ename, e.deptno, d.dname, d.loc FROM emp e, dept d WHERE e.deptno (+) = d.deptno;
文:
SELECT * FROM emp_dept_oj2;
結果:
EMPNO ENAME DEPTNO DNAME LOC ---------- ---------- --------- -------------- ---- 7782 CLARK 10 ACCOUNTING NEW YORK 7839 KING 10 ACCOUNTING NEW YORK 7934 MILLER 10 ACCOUNTING NEW YORK 7369 SMITH 20 RESEARCH DALLAS 7876 ADAMS 20 RESEARCH DALLAS 7902 FORD 20 RESEARCH DALLAS 7788 SCOTT 20 RESEARCH DALLAS 7566 JONES 20 RESEARCH DALLAS 7499 ALLEN 30 SALES CHICAGO 7698 BLAKE 30 SALES CHICAGO 7654 MARTIN 30 SALES CHICAGO 7900 JAMES 30 SALES CHICAGO 7844 TURNER 30 SALES CHICAGO 7521 WARD 30 SALES CHICAGO OPERATIONS BOSTON 15 rows selected.
このビューでは、結合の結果のempno
列がNULL(前述のSELECT
文の最終行)になる可能性があるため、emp
はキー保存表ではなくなります。したがって、このビューでは、UPDATE
、DELETE
およびINSERT
操作を実行できません。
別のネストされたビュー上の外部結合を含むビューの場合は、表を含むビューがその外部ビューの最上位まですべてマージされる場合に、その表はキー保存になります。外部結合されているビューは現在、単純な場合にのみマージされます。次に例を示します。
SELECT col1, col2, ... FROM T;
ビューの選択リストには式がなく、WHERE
句が存在しません。
次のビューのセットを考えてみます。
CREATE VIEW emp_v AS SELECT empno, ename, deptno FROM emp; CREATE VIEW emp_dept_oj1 AS SELECT e.*, Loc, d.dname FROM emp_v e, dept d WHERE e.deptno = d.deptno (+);
これらの例では、emp_v
が単純なビューであるため、emp_v
はemp_dept_oj1
にマージされ、その結果emp
がキー保存表となります。ただし、次のようにemp_v
が変更される場合もあります。
CREATE VIEW emp_v_2 AS SELECT empno, ename, deptno FROM emp WHERE sal > 1000;
この場合は、WHERE
句の存在により、emp_v_2
がemp_dept_oj1
にマージされず、その結果emp
はキー保存表ではなくなります。
ビューが更新可能かどうか不確かな場合は、USER_UPDATABLE_COLUMNS
ビューから選択することで確認できます。次に例を示します。
SELECT owner, table_name, column_name, updatable FROM USER_UPDATABLE_COLUMNS WHERE TABLE_NAME = 'EMP_DEPT_VIEW';
ここでは、次のような出力が返されます。
OWNER TABLE_NAME COLUMN_NAM UPD ---------- ---------- ---------- --- SCOTT EMP_DEPT_V EMPNO NO SCOTT EMP_DEPT_V ENAME NO SCOTT EMP_DEPT_V DEPTNO NO SCOTT EMP_DEPT_V DNAME NO SCOTT EMP_DEPT_V LOC NO 5 rows selected.
次の表に示すビューは、従来どおり更新可能な結合ビューを識別する際に利用できます。
ビュー | 説明 |
---|---|
DBA_UPDATABLE_COLUMNS |
変更可能なすべての表とビューのすべての列が表示されます。 |
ALL_UPDATABLE_COLUMNS |
ユーザーがアクセス可能で変更可能なすべての表とビューのすべての列が表示されます。 |
USER_UPDATABLE_COLUMNS |
ユーザーのスキーマ内で変更可能なすべての表とビューのすべての列が表示されます。 |
次に、emp_dept
ビュー内の更新可能な列を示します。
SELECT COLUMN_NAME, UPDATABLE FROM USER_UPDATABLE_COLUMNS WHERE TABLE_NAME = 'EMP_DEPT'; COLUMN_NAME UPD ------------------------------ --- EMPNO YES ENAME YES DEPTNO YES SAL YES DNAME NO LOC NO 6 rows selected.
関連項目: 更新可能な列のビューの詳細は、『Oracle Databaseリファレンス』を参照してください。 |
ALTER VIEW
文は、無効なビューを明示的に再コンパイルする場合にのみ使用します。ビューの定義を変更する場合は、「ビューの置換」を参照してください。
ALTER VIEW
文を使用すると、実際に使用する前に再コンパイル・エラーを調べることができます。ビューの実表の1つを変更したとき、変更がビューまたはそれに依存する他のオブジェクトに影響しないようにするには、そのビューを明示的に再コンパイルします。
ALTER VIEW
文を使用するには、そのビューが自分のスキーマに含まれているか、またはALTER ANY TABLE
システム権限を持っている必要があります。
関連項目: ALTER VIEW文の構文と詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
自分のスキーマにあるビューはすべて削除できます。別のユーザーのスキーマ内にあるビューを削除するには、DROP ANY VIEW
システム権限が必要です。ビューを削除するには、DROP VIEW
文を使用します。たとえば、次の文はemp_deptビューを削除します。
DROP VIEW emp_dept;
関連項目: DROP VIEW文の構文と詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
ここでは、順序の管理について説明します。この項の内容は、次のとおりです。
順序とは、複数のユーザーが一意の整数を生成するために使用できるデータベース・オブジェクトです。順序ジェネレータは順序番号を生成し、一意主キーの自動的な生成、および複数の行または表の間のキーの調整に使用できます。
順序がない場合、シーケンシャル値はプログラムによって生成されるのみです。新しい主キー値は、最後に生成された値を選択し、その値を増分することによって取得できます。この方法では、トランザクション中のロックが必要となるため、複数のユーザーが主キーの次の値を待機することになり、この待機をシリアライズと呼びます。開発者がこのような構成メンバーをアプリケーションに設定している場合は、順序へのアクセスに置き換えるように薦めてください。順序によってシリアライズが解消され、アプリケーションの同時実行性が改善されます。
関連項目: 順序の概要については、『Oracle Database概要』を参照してください。 |
自分のスキーマに順序を作成するには、CREATE SEQUENCE
システム権限が必要です。別のユーザーのスキーマ内に順序を作成するには、CREATE ANY SEQUENCE
権限が必要です。
順序を作成するには、CREATE SEQUENCE
文を使用します。たとえば、次の文は、emp
表のempno
列に対して従業員番号を生成するために使用する順序を作成します。
CREATE SEQUENCE emp_sequence INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE CACHE 10;
複数のパラメータを指定して、順序の機能を制御できます。これらのパラメータを使用して、順序の昇順または降順、順序の開始点、最大値と最小値、および順序値の間隔を指定できます。NOCYCLE
オプションは、順序が最大値または最小値に達すると、それ以上の値を生成できなくなることを示します。
CACHE
句は順序番号により高速にアクセスできるように、順序番号の集合をメモリーに事前割当てし、維持します。キャッシュ内の最後の順序番号が使用されると、別の順序の集合がキャッシュ内に読み込まれます。
順序番号の集合をキャッシュする場合に、順序番号がスキップされることがあります。たとえば、インスタンスが異常停止すると(たとえばインスタンス障害が発生したり、SHUTDOWN ABORT
文が発行されたりすると)、キャッシュされているが使用されていない順序番号は失われます。また、使用されても保存されなかった順序番号も失われます。さらに、エクスポートとインポートの後、データベースがキャッシュされた順序番号をスキップすることもあります。詳細は、『Oracle Databaseユーティリティ』を参照してください。
順序を変更するには、スキーマに順序が含まれている必要があり、順序に対するALTER
オブジェクト権限またはALTER ANY SEQUENCE
システム権限が必要です。順序を変更して、順序開始番号以外の順序番号の生成方法を定義するパラメータを変更できます。順序の開始点を変更するには、順序を削除し、再作成します。
順序を変更するには、ALTER SEQUENCE
文を使用します。たとえば、次の文は、emp_sequence
を変更します。
ALTER SEQUENCE emp_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE CACHE 20;
関連項目: ALTER SEQUENCE文の構文と詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
順序を使用するには、順序が自分のスキーマに含まれているか、または別のユーザーの順序に対するSELECT
オブジェクト権限が付与されている必要があります。 定義済の順序は、複数のユーザー(該当する順序を含む順序に対するSELECT
オブジェクト権限を持つユーザー)が待機せずにアクセスおよび増分できます。順序を増分したトランザクションの完了を待機せずに、その順序は再び増分されます。
次の各項の例では、マスター/ディテール表の関係における順序の使用方法について説明します。顧客からの注文の情報を格納する2つの表orders_tab
(マスター表)およびline_items_tab
(ディテール表)で部分的に構成される注文入力システムを想定します。order_seq
という名前の順序が、次の文で定義されます。
CREATE SEQUENCE Order_seq START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCYCLE CACHE 20;
順序は、NEXTVAL
およびCURRVAL
疑似列を使用して、SQL文内で参照できます。それぞれの新しい順序番号は、順序の疑似列NEXTVAL
への参照によって生成され、現行の順序番号は、疑似列CURRVAL
を使用して繰り返し参照できます。
NEXTVAL
およびCURRVAL
は、予約語またはキーワードではなく、SELECT
、INSERT
またはUPDATE
のようなSQL文の中で疑似列名として使用できます。
順序番号を生成して使用するには、seq_name.NEXTVAL
を参照します。たとえば、顧客からの発注を受けると想定します。順序番号は、値のリストの中で参照できます。次に例を示します。
INSERT INTO Orders_tab (Orderno, Custno) VALUES (Order_seq.NEXTVAL, 1032);
または、順序番号は、UPDATE
文のSET
句の中で参照できます。次に例を示します。
UPDATE Orders_tab SET Orderno = Order_seq.NEXTVAL WHERE Orderno = 10112;
順序番号は、問合せまたは副問合せのSELECT
の最も外側でも参照できます。次に例を示します。
SELECT Order_seq.NEXTVAL FROM dual;
定義されているように、order_seq.NEXTVAL
への最初の参照が値1を返します。order_seq.NEXTVAL
を参照する後続の各文は、次の順序番号(2、3、4、. . .)を生成します。疑似列NEXTVAL
は、必要に応じた数の新しい順序番号を生成するために使用されます。ただし、各行に生成される順序番号は1つのみです。つまり、1つの文でNEXTVAL
が複数回参照される場合、最初の参照によって次の番号が生成され、文の中のすべての後続の参照によって同じ番号が返されます。
生成された順序番号は、その番号を生成したセッションに対してのみ使用可能です。トランザクションのコミットまたはロールバックには関係なく、order_seq.NEXTVAL
を参照する他のユーザーは一意の値を取得します。2人のユーザーが同時に同じ順序にアクセスしている場合、他方のユーザーも順序番号を生成しているため、各ユーザーが受け取る順序番号に食い違いが生じる可能性があります。
自分のセッションの現在の順序値を使用または参照するには、seq_name.CURRVAL
を参照します。現行のユーザー・セッション(現行または既存のトランザクション内)でseq_name
.NEXTVALが参照された場合のみ、CURRVAL
が使用されます。CURRVAL
は、同一文内で複数回の場合を含め、必要な回数だけ参照できます。次の順序番号は、NEXTVAL
が参照されると生成されます。前述の例を続けると、注文の明細項目を挿入することで、顧客からの発注を完了します。
INSERT INTO Line_items_tab (Orderno, Partno, Quantity) VALUES (Order_seq.CURRVAL, 20321, 3); INSERT INTO Line_items_tab (Orderno, Partno, Quantity) VALUES (Order_seq.CURRVAL, 29374, 1);
前項で指定したINSERT
文が、新しい順序番号347を生成した場合、この項の文で挿入された両方の行は注文番号347の行を挿入します。
CURRVAL
およびNEXTVAL
は、次の場所で使用できます。
INSERT
文のVALUES
句
SELECT
文のSELECT
リスト
UPDATE
文のSET
句
CURRVAL
およびNEXTVAL
は、次の場所では使用できません。
副問合せ
ビューの問合せまたはマテリアライズド・ビューの問合せ
DISTINCT
演算子を指定したSELECT
文
GROUP
BY
またはORDER
BY
句を指定したSELECT
文
UNION
、INTERSECT
またはMINUS
集合演算子を指定した別のSELECT
文と組み合せたSELECT
文
SELECT
文のWHERE
句
CHECK
制約の条件
順序番号は、システム・グローバル領域(SGA)内の順序キャッシュに保持できます。順序キャッシュ内の順序番号へのアクセスは、順序番号をディスクから読み込むより高速です。
順序キャッシュは、複数のエントリで構成されています。各エントリには、単一の順序の順序番号を多数保持できます。
すべての順序番号に高速にアクセスするには、次のガイドラインに従ってください。
順序キャッシュが、アプリケーションによって同時に使用されるすべての順序を保持できるようにしてください。
順序キャッシュ内に保持された各順序の値の数を増やしてください。
アプリケーションが順序キャッシュ内の順序にアクセスする場合、順序番号は高速に読み込まれます。ただし、アプリケーションがキャッシュ内にない順序にアクセスする場合は、順序番号が使用される前に、順序がディスクからキャッシュに読み込まれる必要があります。
アプリケーションが多数の順序を同時に使用する場合は、順序キャッシュの大きさが不足して、すべての順序を保持できないことがあります。このような場合、順序番号へのアクセスにはディスク読取りが頻繁に必要になります。すべての順序に高速にアクセスするには、キャッシュに十分なエントリを用意し、アプリケーションが同時に使用するすべての順序を保持してください。
順序が順序キャッシュに読み込まれるとき、キャッシュ・エントリに順序値が生成および格納されます。その後、これらの値に高速にアクセスできます。キャッシュに格納される順序値の数は、CREATE
SEQUENCE
文のCACHE
パラメータによって決まります。このパラメータのデフォルト値は20です。
次のCREATE
SEQUENCE
文はseq2
順序を作成し、SEQUENCE
キャッシュ内に50個の順序値を格納します。
CREATE SEQUENCE seq2
CACHE 50;
次に、seq2
の最初の50個の値がキャッシュから読み込まれます。51番目の値がアクセスされると、次の50個の値がディスクから読み込まれます。
CACHE
に上限を選択することにより、ディスクから順序キャッシュへの読取りを減らし、より長く連続する順序番号にアクセスできます。ただし、インスタンス障害が発生した場合は、キャッシュ内のすべての順序値が失われます。エクスポートの実行中にトランザクションが順序番号へのアクセスを続ける場合、エクスポートとインポートの後で、キャッシュされた順序番号がスキップされることもあります。
CREATE
SEQUENCE
文の中でNOCACHE
オプションを使用する場合、順序値は順序キャッシュに格納されません。この場合は、順序にアクセスするたびにディスク読取りが必要となります。このようなディスク読取りにより、順序へのアクセスが遅くなります。次のCREATE
SEQUENCE
文はSEQ3
順序を作成しますが、その値をキャッシュ内に格納しません。
CREATE SEQUENCE seq3 NOCACHE;
自分のスキーマ内の順序はどれでも削除できます。別のスキーマ内の順序を削除するには、DROP ANY SEQUENCE
システム権限が必要です。 不要になった順序は、DROP SEQUENCE
文を使用して削除できます。たとえば、次の文はorder_seq
順序を削除します。
DROP SEQUENCE order_seq;
順序を削除すると、その定義がデータ・ディクショナリから削除されます。順序のシノニムはそのまま残りますが、参照時にエラーが返されます。
関連項目: DROP SEQUENCE文の構文と詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
ここでは、シノニムの管理について説明します。この項の内容は、次のとおりです。
シノニムは、スキーマ・オブジェクトの別名です。シノニムは、オブジェクトの名前および所有者をマスキングし、分散データベースのリモート・オブジェクトに対する位置の透過性を提供することで、一定レベルのセキュリティを提供できます。また、データベース・ユーザーにとって、シノニムは使いやすく、SQL文の複雑さが軽減されます。
シノニムを使用することで、基礎となるオブジェクトの名前変更または移動が可能になります。その場合、シノニムの再定義のみで、そのシノニムに基づくアプリケーションは変更しなくてもそのまま機能します。
パブリック・シノニムとプライベート・シノニムの両方を作成できます。パブリック・シノニムはPUBLIC
という名前の特別なユーザー・グループによって所有され、データベース内のすべてのユーザーがアクセスできます。プライベート・シノニムは、特定のユーザーのスキーマ内に含まれており、そのユーザーおよび基礎となるオブジェクトの権限受領者のみが使用できます。
シノニム自体は安全ではありません。シノニムのオブジェクト権限を付与した場合、実際には基礎となるオブジェクトの権限を付与することになり、そのシノニムはGRANT
文でオブジェクトの別名としてのみ機能します。
関連項目: シノニムの詳細は、『Oracle Database概要』を参照してください。 |
自分のスキーマに新しいプライベート・シノニムを作成するには、CREATE SYNONYM
システム権限が必要です。別のユーザーのスキーマ内にプライベート・シノニムを作成するには、CREATE ANY SYNONYM
権限が必要です。パブリック・シノニムを作成するには、CREATE PUBLIC SYNONYMシステム権限が必要です。
シノニムを作成するには、CREATE SYNONYM
文を使用します。CREATE SYNONYM
文を正常に実行するために、基礎となるスキーマ・オブジェクトは必要なく、また、そのオブジェクトにアクセスする権限も不要です。次の文は、jward
のスキーマに含まれるemp
表のパブリック・シノニムpublic_emp
を作成します。
CREATE PUBLIC SYNONYM public_emp FOR jward.emp
リモート・プロシージャまたはファンクションのシノニムを作成する場合は、そのリモート・プロシージャまたはファンクションのスキーマ名でリモート・オブジェクトを修飾する必要があります。また、リモート・オブジェクトが存在するデータベースに、ローカル・パブリック・シノニムを作成できますが、この場合は、プロシージャまたはファンクションへの後続のすべてのコールに、そのデータベース・リンクを含める必要があります。
関連項目: CREATE SYNONYM文の構文と詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
基礎となるオブジェクトへのアクセスに必要な権限が、明示的に、使用可能なロールから、またはPUBLIC
から付与されている場合は、自分のスキーマまたはパブリック・シノニムに含まれるプライベート・シノニムを正常に使用できます。また、基礎となるオブジェクトについて必要なオブジェクト権限が付与されている場合は、別のスキーマ内のプライベート・シノニムを参照することもできます。
付与されているオブジェクト権限のみを使用して、別のユーザーのシノニムを参照できます。たとえば、jward
.emp
表に対するSELECT
権限のみがあるときに、シノニムjward.employee
がjward.emp
に対して作成された場合は、jward
.employee
シノニムの問合せはできますが、jward
.employee
シノニムを使用した行の挿入はできません。
シノニムは、そのシノニムの基礎となるオブジェクトを参照するのと同じ方法で、DML文で参照できます。たとえば、employee
というシノニムが表またはビューを参照する場合は、次の文が有効になります。
INSERT INTO employee (empno, ename, job) VALUES (emp_sequence.NEXTVAL, 'SMITH', 'CLERK');
fire_emp
というシノニムがスタンドアロン・プロシージャまたはパッケージ・プロシージャを参照する場合は、それをコマンドで実行できます。
EXECUTE Fire_emp(7344);
自分のスキーマ内のプライベート・シノニムはどれでも削除できます。別のユーザーのスキーマ内にあるプライベート・シノニムを削除するには、DROP ANY SYNONYM
システム権限が必要です。パブリック・シノニムを削除するには、DROP PUBLIC SYNONYM
システム権限が必要です。
不要になったシノニムを削除するには、DROP SYNONYM
文を使用します。プライベート・シノニムを削除する場合は、PUBLIC
キーワードを省略します。パブリック・シノニムを削除する場合は、PUBLIC
キーワードを指定します。
たとえば、次の文はプライベート・シノニムemp
を削除します。
DROP SYNONYM emp;
次の文は、パブリック・シノニムpublic_emp
を削除します。
DROP PUBLIC SYNONYM public_emp;
シノニムを削除すると、その定義がデータ・ディクショナリから削除されます。削除したシノニムを参照するオブジェクトはすべて残ります。ただし、それらのオブジェクトは無効(使用不可)になります。シノニムの削除が他のスキーマ・オブジェクトに与える影響の詳細は、「オブジェクト依存性の管理」を参照してください。
関連項目: DROP SYNONYM文の構文と詳細は、『Oracle Database SQL言語リファレンス』 を参照してください。 |
次のビューには、ビュー、シノニムおよび順序に関する情報が表示されます。
ビュー | 説明 |
---|---|
DBA_VIEWS
|
DBA ビューには、データベース内のすべてのビューが表示されます。ALL ビューは、現行ユーザーがアクセスできるビューのみに制限されます。USER ビューは、現行ユーザーが所有するビューのみに制限されます。 |
DBA_SYNONYMS
|
これらのビューには、シノニムが表示されます。 |
DBA_SEQUENCES
|
これらのビューには、順序が表示されます。 |
DBA_UPDATABLE_COLUMNS
|
これらのビューには、更新可能な結合ビューの列がすべて表示されます。 |
関連項目: これらのビューの完全な説明は、『Oracle Databaseリファレンス』を参照してください。 |