指定した記憶域マップの定義を削除します。
DROP STORAGE MAP文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。map-name
削除する記憶域マップの名前を指定します。
- 表から記憶域マップを削除するには、DROP表権限が必要です。
- 記憶域マップが削除されると、表は暗黙的にデフォルトの記憶域にマップされます。
- データを含む表を参照する記憶域マップは削除できません。削除しようとすると、エラー・メッセージが返されます。
- 基底記憶域マップは、DROP TABLEを使用すると削除されます。
- 同時に問合せに含まれている表をその記憶域マップが参照する場合に、記憶域マップを削除しようとすると失敗します。記憶域マップを削除する前に、ユーザーはDISCONNECT文でデータベースからデタッチする必要があります。Oracle Rdbが最初に表などのオブジェクトにアクセスすると、そのオブジェクトにロックがかけられ、ユーザーがそのデータベースを終了するまで解除されません。このオブジェクトを更新しようとすると、他のユーザーがこのオブジェクトにアクセスしているため、LOCK CONFLICT ON CLIENTメッセージが表示されます。
同様に、記憶域マップの削除中、DROP文に対してCOMMIT文またはROLLBACK文を使用してトランザクションを完了するまで、ユーザーは記憶域マップが参照する表に関連する問合せを実行できません。実行しようとすると、「lock conflict on client」のエラー・メッセージが表示されます。- DROP STORAGE MAP文を発行すると、他のユーザーがデータベースにアタッチできるようになります。
例1: 対話型SQLにおける記憶域マップの削除この例では記憶域マップを削除します。データを含む表を参照する記憶域マップは削除できません。
SQL> ATTACH 'FILENAME mf_personnel'; SQL> DROP STORAGE MAP WORK_STATUS_MAP; %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-RELNOTEMPTY, relation WORK_STATUS has data in it SQL> DELETE FROM WORK_STATUS; 3 rows deleted SQL> DROP STORAGE MAP WORK_STATUS_MAP; SQL>
シノニム定義を削除します。
DROP SYNONYM文は次の環境で使用できます。
- 対話型SQL内
- ホスト言語プログラムに埋め込まれる場合
- SQLモジュールまたはその他の複合文のプロシージャの一部として
- 動的SQLで動的に実行される文として
CASCADE
他のデータベース・オブジェクトでこの名前が参照されている場合でも、SQLでシノニム定義を削除することを指定します。これにより後で問合せ実行のエラーが発生する場合があります。この名前を参照するストアド・ファンクション、ストアド・プロシージャおよびトリガーは無効であるとマークされます。IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。PUBLIC
このオプションの句は、Oracleデータベース・サーバーとの互換性を目的としています。Oracle Rdbでは現在使用されていません。使用するかどうかは、将来のリリースで決定します。アプリケーションではPUBLICキーワードの使用をお薦めします。RESTRICT
この名前を参照するデータベース・オブジェクトが検出された場合でも、SQLでDROP文を中断することを指定します。これはデフォルトです。synonym-name
削除する既存のシノニムの名前です。
- 被参照オブジェクトのシノニムを削除するには、そのオブジェクトに対するREFERENCES権限が必要です。ドメインにはアクセス制御がないため、ドメインのシノニムを削除する場合にその他の権限は必要ありません。
- DROP SYNONYM文を実行するには、データベースのDROP権限が必要です。
例1: シノニムの削除
SQL> DROP PUBLIC SYNONYM employees CASCADE;
指定した表定義を削除します。データベースにアタッチする際にPATHNAME修飾子を使用している場合、DROP TABLE文でもリポジトリから表が削除されます。
DROP TABLE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
CASCADE
指定された表を参照するその他の定義(制約、索引、モジュール、記憶域マップ、トリガーおよびビュー)をすべて削除してから表定義を削除するように指定します。これはカスケード削除と呼ばれます。ルーチンまたは言語セマンティクス依存性のあるストアド・ルーチンまたはトリガーの場合、対象となるルーチンおよびトリガーも無効としてマークされます。IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。RESTRICT
指定した表定義のみを削除するように指定します。指定した表を参照する制約、モジュール、トリガーまたはビューが定義されている場合、SQLでは表は削除されません。指定した表を参照する索引または記憶域マップがある場合、SQLでは表と記憶域マップが削除されますが、エラー・メッセージは発行されません。table-name
削除する表定義の名前を指定します。
- データベースから表を削除するには、表のDROP権限が必要です。
- 表に関連する他のアクティブなトランザクションがある場合は、表を削除できません。つまり、表への排他アクセスが必要です。
- 表が同時に問合せに関与している場合、表を削除しようとすると失敗します。
- CASCADE、RESTRICTのいずれのキーワードも指定しなかった場合、SQLではデフォルトで制限付きの削除が実行されます。
- CASCADEオプションでは、この表を参照するすべてのアクティブな問合せが無効になります。ORACLE言語を使用している場合は、これはRESTRICTにも該当します。
- SQLが最初に表などのオブジェクトにアクセスすると、そのオブジェクトにロックがかけられ、ユーザーがそのデータベースを終了するまで解除されません。
Oracle Rdbを使用している場合にこのオブジェクトを更新しようとすると、他のユーザーがこのオブジェクトにアクセスしているため、「lock conflict on client」のメッセージが表示されます。
同様に、表の削除中、DROP文に対してCOMMIT文またはROLLBACK文を使用してトランザクションを完了するまで、ユーザーはその表に関連する問合せを実行できません。Oracle Rdbを使用している場合、「lock conflict on client」のエラー・メッセージが表示されます。- DROP TABLE文のパフォーマンスは、表を格納する記憶域ファイルの定義内容に応じて大きく異なります。複数ファイルのデータベースでは、基本記憶域がPAGE FORMAT IS MIXED記憶域パラメータで作成されている場合、パフォーマンスは遅くなります。
表に1つ以上のLIST OF BYTE VARYING列が含まれる場合、DROP TABLE文で表の各行を読み取り、すべてのLIST値のポインタを記録する必要があります。このリストは、COMMIT時に処理され、LIST列データを削除します。したがって、データベース管理者は、表の削除時にこの時間も考慮する必要があります。
削除されたLIST列では、表の各行を更新し、NULLに設定する必要があるため、EXCLUSIVE WRITEに対する表を予約することをお薦めします。このアクションにより、コミット時の処理のポインタがキューに入ります。予約モードにより、スナップショット・ファイルのI/Oが削除され、ロック・リソースの粒度が下げられ、仮想メモリーの使用率が低減されます。
LISTデータは表の外部に格納されるため、データベースにRESTRICTED ACCESS句でアタッチすることによりパフォーマンスが向上します。この句は、EXCLUSIVEアクセスに対して全LIST記憶域を予約するという副次的な効果があるため、LISTデータ削除中のスナップショットのI/Oが削除されます。- DROP TABLE文を発行すると、他のユーザーがデータベースにアタッチできるようになります。
- ビュー定義が削除対象の表を参照する場合は、そのビュー定義を削除してから表を削除するか、CASCADEを指定する必要があります。
- トリガー定義が削除対象の表を参照する場合は、そのトリガー定義を削除してから表を削除するか、CASCADEを指定する必要があります。
- Oracle Rdbでは、ストアド・ルーチンとメタデータ(表など)の間に基礎となる依存関係が作成されるため、CASCADEを指定した場合はルーチンまたは言語セマンティクス依存性のある表を削除できますが、RESTRICTでは削除できません。DROP TABLE CASCADEの場合、ストアド・ルーチンで参照される表を削除すると、ストアド・ルーチンは無効であるとマークされます。DROP TABLE RESTRICTの場合、ストアド・ルーチンで参照される表を削除しようとすると文が失敗するため、依存するストアド・ルーチンは無効になりません。ストアド・ルーチンの無効化が可能な文と不可能な文のリストは、「CREATE MODULE文」を参照してください。
ストアド・ルーチン依存性の種類およびメタデータ変更によるストアド・ルーチン無効化の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。- The DROP TABLE文では、削除された表を参照する問合せアウトラインが無効であるとマークされます。
- COMPUTED BY列は、DROP TABLE CASCADE文により削除された永続実表、グローバル一時表またはローカル一時表を参照する場合、COMPUTE NULLに変更されます。次に例を示します。
SQL> CREATE TABLE t1 (col1 INTEGER, cont> col2 INTEGER); SQL> -- SQL> CREATE TABLE t2 (x INTEGER, cont> y COMPUTED BY (SELECT COUNT(*) FROM cont> t1 WHERE t1.col1 = t2.x)); SQL> -- SQL> -- Assume values have been inserted into the tables. SQL> -- SQL> SELECT * FROM t1; COL1 COL2 1 100 1 101 1 102 2 200 3 300 5 rows selected SQL> SELECT * FROM t2; X Y 1 3 3 1 2 rows selected SQL> -- SQL> DROP TABLE t1 CASCADE; Computed Column Y in table T2 is being set to NULL. SQL> SELECT * FROM t2; X Y 1 NULL 3 NULL
表を変更してCOMPUTED BY列を削除できます。将来のある時点で、表を変更し、同じ名前で異なるcomputed-by式を使用して新しいCOMPUTED BY列を作成できます。
ただし、COMPUTED BY列は、DROP TABLE CASCADE文により削除された宣言されたローカル一時表を参照する場合、NULLに設定されません。この状況で宣言されたローカル一時表に問い合せると、例外が発生します。
例1: アタッチ・データベースからの表の削除
SQL> ATTACH 'ALIAS PERS FILENAME personnel'; SQL> DROP TABLE PERS.DEGREES; SQL> COMMIT;
例2: デフォルト・データベースからの参照元である表および定義の削除
SQL> ATTACH 'FILENAME corporate_data'; SQL> DROP TABLE ADMINISTRATION.PERSONNEL.EMPLOYEES CASCADE; View ADMINISTRATION.PERSONNEL.REVIEW_DATE is also being dropped. View ADMINISTRATION.PERSONNEL.CURRENT_INFO is also being dropped. View ADMINISTRATION.PERSONNEL.CURRENT_SALARY is also being dropped. View ADMINISTRATION.PERSONNEL.CURRENT_JOB is also being dropped. Constraint ADMINISTRATION.RECRUITING.DEGREES_FOREIGN2 is also being dropped. Constraint ADMINISTRATION.PERSONNEL.EMPLOYEES_PRIMARY_EMPLOYEE_ID is also being dropped. Constraint ADMINISTRATION.PERSONNEL.EMP_SEX_VALUES is also being dropped. Constraint ADMINISTRATION.PERSONNEL.HOURLY_HISTORY_FOREIGN1 is also being dropped. Constraint ADMINISTRATION.PERSONNEL.JOB_HISTORY_FOREIGN1 is also being dropped. Constraint ADMINISTRATION.RECRUITING.RESUMES_FOREIGN2 is also being dropped. Constraint ADMINISTRATION.PERSONNEL.SALARY_HISTORY_FOREIGN1 is also being dropped. Constraint ADMINISTRATION.PERSONNEL.STATUS_CODE_VALUES is also being dropped. Index ADMINISTRATION.PERSONNEL.EMP_LAST_NAME is also being dropped. Index ADMINISTRATION.PERSONNEL.EMP_EMPLOYEE_ID is also being dropped. Trigger ADMINISTRATION.PERSONNEL.EMPLOYEE_ID_CASCADE_DELETE is also being dropped. Trigger ADMINISTRATION.PERSONNEL.STATUS_CODE_CASCADE_UPDATE is also being dropped.
物理データベースからトリガー定義を削除します。データベースがPATHNAME修飾子を使用してアタッチされている場合は、リポジトリから削除します。
DROP TRIGGER文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。trigger-name
削除対象のトリガーの名前を変更します。
- トリガーを削除するには、トリガーが定義されている表のDELETEアクセス権が必要です。
- 表からトリガーを削除するには、DROP表権限が必要です。
- トリガーが同時に問合せに関与している場合、トリガーを削除しようとすると失敗します。トリガーを削除する前に、ユーザーはDISCONNECT文でデータベースからデタッチする必要があります。Oracle Rdbが最初にトリガーによりアクセスされる表などのオブジェクトにアクセスすると、そのオブジェクトにロックがかけられ、ユーザーがそのデータベースを終了するまで解除されません。このオブジェクトを更新しようとすると、他のユーザーがこのオブジェクトにアクセスしているため、LOCK CONFLICT ON CLIENTメッセージが表示されます。
同様に、トリガーの削除中、DROP文に対してCOMMIT文またはROLLBACK文を使用してトランザクションを完了するまで、ユーザーはそのトリガーにより参照される表に関連する問合せを実行できません。実行しようとすると、「lock conflict on client」のエラー・メッセージが表示されます。- DROP TRIGGER文を発行すると、他のユーザーがデータベースにアタッチできるようになります。
例1: EMPLOYEE_ID_CASCADE_DELETEトリガーの削除
SQL> ATTACH 'FILENAME personnel'; SQL> SHOW TRIGGERS User triggers in database with filename PERSONNEL COLLEGE_CODE_CASCADE_UPDATE EMPLOYEE_ID_CASCADE_DELETE STATUS_CODE_CASCADE_UPDATE SQL> DROP TRIGGER EMPLOYEE_ID_CASCADE_DELETE; SQL> SHOW TRIGGERS User trigggers in database with filename PERSONNEL COLLEGE_CODE_CASCADE_UPDATE STATUS_CODE_CASCADE_UPDATE SQL>
データベースからユーザー名や特殊ユーザー・クラスのエントリ(CREATE USER文またはGRANT文で作成されたエントリなど)を削除します。
DROP文は次の環境で使用できます。
- 対話型SQL内
- ホスト言語プログラムに埋め込まれる場合
- SQLモジュールまたはその他の複合文のプロシージャの一部として
- 動的SQLで動的に実行される文として
CASCADE
CASCADE句により、指定したユーザーをデータベースから削除し、アクセス制御リスト(ACL)、モジュールおよびスキーマに存在する、このユーザーへの参照をすべて削除します。PUBLICユーザーを削除した場合、ACLはPUBLICエントリの削除のために処理されません。RESTRICT
RESTRICT句で指定したユーザーが削除されます。別のACLにこのユーザーへの参照がある場合は、DROP USER文は失敗します。username
データベース内の既存のユーザー名です。
- ユーザーを削除するには、データベースに対するSECURITY権限が必要です。
- SHOW SYSTEM USERS文またはSHOW USERS文を発行することにより、データベースに定義されている既存のユーザーを表示できます。
例1: ユーザーの削除
SQL> SHOW USER Users in database with filename mf_personnel.rdb JSMITH NSTUART SQL> DROP USER JSMITH; SQL> SHOW USER Users in database with filename mf_personnel.rdb NSTUART SQL>
指定したビュー定義を削除します。DROP VIEW文を実行すると、SQLによりデータベースからビュー定義が削除されます。PATHNAME修飾子を使用してデータベースにアタッチしている場合、SQLではビュー定義もリポジトリから削除します。
DROP VIEW文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
CASCADE
指定されたビューを参照するその他のビュー定義を削除してからそのビュー定義を削除するように指定します。これはカスケード削除と呼ばれます。ルーチンまたは言語セマンティクス依存性のあるストアド・ルーチンまたはトリガーで参照されるビューを削除する場合、対象となるルーチンおよびトリガーも無効としてマークされます。IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。RESTRICT
指定したビュー定義のみを削除するように指定します。指定したビューを参照する他のビュー、トリガーまたはルーチンがある場合、その削除は失敗します。デフォルトはRESTRICTです。view-name
削除するビュー定義の名前を指定します。
- データベースからビューを削除するには、ビューのDROP権限が必要です。
- Oracle Rdbでは、ストアド・ルーチンとメタデータ(ビューなど)の間に基礎となる依存関係が作成されるため、CASCADEを指定した場合はルーチンまたは言語セマンティクス依存性のあるビューを削除できますが、RESTRICTでは削除できません。DROP VIEW CASCADEの場合、ストアド・ルーチンで参照されるビューを削除すると、ストアド・ルーチンは無効であるとマークされます。DROP VIEW RESTRICTの場合、ストアド・ルーチンで参照されるビューを削除しようとすると文が失敗するため、依存するストアド・ルーチンは無効になりません。ストアド・ルーチンの無効化が可能な文と不可能な文のリストは、「CREATE MODULE文」を参照してください。
ストアド・ルーチン依存性の種類およびメタデータ変更によるストアド・ルーチン無効化の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。- 削除されたビューをCOMPUTED BY列で参照する場合、COMPUTED BY列はCOMPUTE NULLに変更されます。
例1: ビュー定義の削除次の例では、ビュー定義CURRENT_INFOが削除されます。
SQL> DROP VIEW CURRENT_INFO; SQL> COMMIT;
例2: 依存ビューのあるビューの削除
この例では、DROP VIEW文で名前が付けられたビューを参照するビューが自動的に削除されないことを示します。CASCADEキーワードを使用して、依存ビューのあるビューを削除する必要があります。
SQL> DROP VIEW CURRENT_JOB; %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-VIEWINVIEW, view CURRENT_JOB is referenced by view CURRENT_INFO -RDMS-F-VIEWNOTDEL, view CURRENT_JOB has not been deleted SQL> DROP VIEW CURRENT_JOB CASCADE; View CURRENT_INFO is also being dropped. SQL> COMMIT;
例3: データベースへの新規定義の追加
事前定義されたSQLスクリプトを使用してメタデータ定義を更新する場合、保持しているデータベースの一部に存在しないオブジェクトの削除が必要になることがあります。たとえば、DROP VIEWを追加すると次に示すエラーが発生する場合があります。
SQL> drop view CURRENT_INFO; %SQL-F-RELNOTDEF, Table CURRENT_INFO is not defined in database or schema SQL> create view CURRENT_INFO cont> ...etc...
IF EXISTS句を使用するとエラー・メッセージが抑制され、メンテナンス・スクリプト実行の混乱が軽減されます。
SQL> drop view CURRENT_INFO if exists; SQL> create view CURRENT_INFO cont> ...etc...