指定された照合順番を削除します。データベースまたはデータベース内のドメインで使用されている照合順番は削除できません。
DROP COLLATING SEQUENCE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
collation-name
照合順番の作成時に使用したcollation-name引数をCREATE COLLATING SEQUENCE文に指定します。IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。
- データベースから照合順番を削除するには、データベースDROP権限が必要です。
- データベースのデフォルトに設定した照合順番は削除できません。
SQL> create database filename TEST cont> collating sequence french french; SQL> drop coll seq french; %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-COLUSEDDB, the collating sequence named FRENCH is used by the database
- この文は読取り/書込みトランザクションで実行する必要があります。アクティブなトランザクションがない場合にこの文を発行すると、SQLでは、読取り/書込みトランザクションが暗黙的に開始されます。
- DROP COLLATING SEQUENCE文を発行すると、他のユーザーがデータベースにアタッチできるようになります。
例1: フランス語の照合順番の作成および削除次の例では、事前定義された照合順番FRENCHを使用して照合順番が作成されます。その後、SHOW COLLATING SEQUENCE文を使用して定義済の照合順番が表示されます。
次に、DROP COLLATING SEQUENCE文を使用して照合順番が削除されます。SHOW COLLATING SEQUENCE文では、照合順番が存在しないことを示しています。
SQL> ATTACH 'FILENAME personnel'; SQL> CREATE COLLATING SEQUENCE FRENCH FRENCH; SQL> -- SQL> SHOW COLLATING SEQUENCE User collating sequences in database with filename personnel FRENCH SQL> -- SQL> DROP COLLATING SEQUENCE FRENCH; SQL> -- SQL> SHOW COLLATING SEQUENCE User collating sequences in database with filename personnel No collating sequences found
例2: ドメインまたはデータベースの定義に使用した照合順番の削除
次の例では、照合順番を使用してデータベースまたはドメインが定義されている場合、照合順番は削除できないことを示しています。
SQL> CREATE COLLATING SEQUENCE SPANISH SPANISH; SQL> CREATE DOMAIN LAST_NAME_SPANISH CHAR (14) cont> COLLATING SEQUENCE IS SPANISH; SQL> -- SQL> SHOW DOMAIN LAST_NAME_SPANISH LAST_NAME_SPANISH CHAR(14) Collating sequence: SPANISH SQL> -- SQL> SHOW COLLATING SEQUENCE User collating sequences in database with filename personnel SPANISH SQL> -- SQL> -- You cannot delete the collating sequence because the SQL> -- domain LAST_NAME_SPANISH, defined using SPANISH, still exists: SQL> -- SQL> DROP COLLATING SEQUENCE SPANISH; %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-COLUSEDFLD, the collating sequence named SPANISH is used in field LAST_NAME_SPANISH SQL> -- SQL> -- Delete the domain: SQL> -- SQL> DROP DOMAIN LAST_NAME_SPANISH; SQL> -- SQL> -- Now you can delete the collating sequence: SQL> -- SQL> DROP COLLATING SEQUENCE SPANISH; SQL> -- SQL> SHOW COLLATING SEQUENCE User collating sequences in database with filename personnel No collating sequences found
指定された制約を削除します。
DROP CONSTRAINT文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
constraint-name
削除する制約の名前を指定します。IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。
- 表制約または列制約によって参照される各表に対するDROP表権限が必要です。たとえば、FOREIGN KEY制約は、被参照表のみでなくソース表についてもDROP権限が必要です。
- その制約が列制約または表制約である場合、このDROP文は暗黙的にALTER TABLE...DROP CONSTRAINTを実行します。詳細は、「ALTER TABLE文」を参照してください。
- 制約が同時に問合せに関与する表にある場合、制約を削除しようとすると失敗します。制約を削除する前に、ユーザーはDISCONNECT文でデータベースからデタッチする必要があります。Oracle Rdbが最初に制約などのオブジェクトにアクセスすると、そのオブジェクトにロックがかけられ、ユーザーがそのデータベースを終了するまで解除されません。このオブジェクトを更新しようとすると、他のユーザーがこのオブジェクトにアクセスしているため、「lock conflict on client」のメッセージが表示されます。
- DROP CONSTRAINT文では、DATA DEFINITIONモードで予約された表の制約を参照できます。
例1: 制約の削除次の例ではSEX_NOT_NULL制約を削除します。
SQL> DROP CONSTRAINT SEX_NOT_NULL;
データベースを削除します。Oracle Rdbでこの文が実行されると、SQLではデータベースに関連付けられたデータベース・ルート・ファイルおよび記憶域ファイルがすべて削除されます。
DROP DATABASE文にリポジトリ・パス名を指定するか、PATHNAME引数でアタッチされたデータベースの別名を指定すると、SQLではデータベース定義を格納するリポジトリ・ディレクトリも削除されます。
注意
DROP DATABASE文は慎重に使用してください。DROP DATABASE文の取消しには、ROLLBACK文は使用できません。この文が使用されると、SQLでは、すべてのデータおよびすべての定義が格納されている、データベース・ルート・ファイルおよび記憶域ファイルが削除されます。
DROP DATABAS文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
ALIAS alias
アタッチされたデータベースの別名を指定します。DROP DATABASE文は、データベース、および別名に関連付けられたすべてのデータベース・ルート・ファイルと記憶域ファイルを削除します。データベースがPATHNAME引数で宣言されている場合、ROP DATABASE文でも、データベース定義が含まれるリポジトリ・ディレクトリが削除されます。
FILENAME 'attach-spec'
データベースにアクセスするために必要な完全または部分的な情報が含まれる引用符付き文字列を指定します。アタッチ仕様には、.rdbファイルのファイル仕様が含まれます。DROP DATABASE文は、データベース、およびデータベース・ルート・ファイル仕様に関連付けられたすべてのデータベース・システム・ファイルを削除します。部分的なファイル仕様を使用すると、SQLでは標準のデフォルトが使用されます。DROP DATABASE文は、データベース定義が含まれるリポジトリ・ディレクトリもあるかどうかに関係なく、データベース・ファイルのみを削除します。
literal-user-auth
データベース(特にリモート・データベース)へのアクセスに使用するユーザー名およびパスワードを指定します。このリテラルにより、DROP DATABASE文でユーザー名およびパスワードの情報を明示的に指定できます。
PATHNAME path-name
データベース定義が保存されているリポジトリ・ディレクトリのリポジトリ・パス名としてフルパス名または相対パス名を指定します。ファイル仕様ではなくパス名を使用して、データベース・ルート・ファイルおよび記憶域ファイルとともにリポジトリからリポジトリ・データベース定義を削除します。「DROP PATHNAME文」も参照してください。USER 'username'
データベース・システムで権限チェックに使用されるオペレーティング・システムのユーザー名を指定する文字列リテラルを定義します。USING 'password'
USER句で指定されているユーザー名に対するユーザーのパスワードを指定する文字列リテラルを定義します。
- データベースを削除するにはDROPデータベース権限が必要です。
- 現時点で他のユーザーがアタッチしているか、RMU/OPENコマンドを使用してオープンしているOracle Rdbデータベースは削除できません。
- アフターイメージ・ジャーナル(.aij)・ファイルは削除されません。
例1: ファイルのみの削除この文では、データベースpersonnel.rdbに関連付けられたデータベースのデータベース・システム・ファイルが削除されます。このデータベースにリポジトリ・ディレクトリに保存されている定義もある場合、このDROP DATABASE文ではその定義は削除されません。
SQL> DROP DATABASE FILENAME personnel;
例2: ファイルおよびリポジトリ定義の削除
データベース・ファイルおよびリポジトリ定義を削除するには、DROP DATABASE文にリポジトリ・パス名を指定する必要があります。この文では、関連付けられたデータベース・ルート・ファイルおよび記憶域ファイル以外に、リポジトリ・ディレクトリCDD$TOP.ACCOUNTING.PERSONNELも削除されます。
SQL> DROP DATABASE PATHNAME CDD$TOP.ACCOUNTING.PERSONNEL;
ドメイン定義を削除します。PATHNAME修飾子を使用してデータベースにアタッチしている場合、SQLではドメイン定義もリポジトリから削除されます。
DROP DOMAIN文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
domain-name
削除するドメインの名前を指定します。IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。
- データベースからドメインを削除するには、DROPデータベース権限が必要です。
- 指定したドメインを削除できます。ただし、表の列定義で参照されているドメインは削除できません。列定義で参照されているドメインを削除するには、最初にALTER TABLE文を使用して列定義を変更または削除する必要があります。列定義が制約または索引定義で使用されている場合は、最初に制約または索引定義を削除してから列定義を変更または削除する必要があります。
- Oracle Rdbでは、ストアド・ルーチンとメタデータ(ドメインなど)の間に依存関係が作成され、これに基づいてコンパイルおよび格納されるため、ルーチンまたはトリガーの依存性のあるドメインは削除できません。ストアド・ルーチンおよびトリガー無効にできる文またはできない文のリストは、「CREATE MODULE文」および「CREATE TRIGGER文」を参照してください。
ストアド・ルーチン依存性の種類およびメタデータ変更によるストアド・ルーチン無効化の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。- DROP SCHEMA CASCADE文の一部としてドメインが削除される場合、ドメインのプロパティはそのドメインを使用して定義した列に継承されます。
例1: 列に参照されないドメインの削除
SQL> -- SQL> -- The following CREATE DOMAIN statement creates a domain SQL> -- that is not used by any columns: SQL> -- SQL> CREATE DOMAIN ABCD IS CHAR(4); SQL> -- SQL> -- The SHOW DOMAINS statement shows domain ABCD at the SQL> -- top of the list: SQL> -- SQL> SHOW DOMAINS User domains in database with filename personnel ABCD CHAR(4) ADDRESS_DATA_1_DOM CHAR(25) ADDRESS_DATA_2_DOM CHAR(20) . . . SQL> -- SQL> -- Now delete the domain: SQL> -- SQL> DROP DOMAIN ABCD; SQL> -- SQL> -- The SHOW DOMAINS statement shows that the SQL> -- domain ABCD has been deleted: SQL> -- SQL> SHOW DOMAINS User domains in database with filename personnel ADDRESS_DATA_1_DOM CHAR(25) ADDRESS_DATA_2_DOM CHAR(20) . . .
例2: 列に参照されるドメインの削除
次の例では、ドメインの定義が削除されます。列がドメイン定義を、制約がその列を参照するため、最初に表を変更してからドメインを削除する必要があります。
SQL> -- SQL> -- Attempt to delete the domain SEX_DOM. Error messages SQL> -- indicate that the table EMPLOYEES uses the domain SQL> -- SEX_DOM, so SEX_DOM cannot yet be deleted: SQL> -- SQL> DROP DOMAIN SEX_DOM; %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-RELEXI, field SEX_DOM is used in relation EMPLOYEES -RDMS-F-FLDNOTDEL, field SEX_DOM has not been deleted SQL> -- SQL> -- Looking at the EMPLOYEES table shows that SEX is the SQL> -- column that depends on the domain SEX_DOM. Try SQL> -- to delete the column SEX; error messages indicate that the SQL> -- constraint EMP_SEX_VALUES depends on the column SEX: SQL> -- SQL> ALTER TABLE EMPLOYEES DROP COLUMN SEX; %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-FLDINCON, field SEX is referenced in constraint EMP_SEX_VALUES -RDMS-F-RELFLDNOD, field SEX has not been deleted from relation EMPLOYEES SQL> -- SQL> -- Delete the constraint EMP_SEX_VALUES: SQL> -- SQL> ALTER TABLE EMPLOYEES DROP CONSTRAINT EMP_SEX_VALUES; SQL> -- SQL> -- Because EMP_SEX_VALUES was the only constraint or index SQL> -- that depended on the column SEX, you can now delete SQL> -- the column SEX: SQL> -- SQL> ALTER TABLE EMPLOYEES DROP COLUMN SEX; SQL> -- SQL> -- The column SEX in the table EMPLOYEES was the only column in SQL> -- the database that depended on the domain SEX_DOM, so you can SQL> -- now delete the domain SEX_DOM: SQL> -- SQL> DROP DOMAIN SEX_DOM; SQL>
指定した索引定義を削除します。PATHNAME修飾子を使用してデータベースにアタッチしている場合、SQLでは索引定義もリポジトリから削除されます。
DROP INDEX文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
CASCADE
この索引を使用する任意の記憶域マップを、NO PLACEMENT VIA INDEX記憶域マップに変更するように指定します。IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。index-name
削除する索引定義の名前を指定します。RESTRICT
索引がOracle Rdbデータベース内の他のオブジェクトによって参照される場合、その索引の削除を回避します。デフォルトはRESTRICTです。
- 表から索引を削除するには、DROP表権限が必要です。
- 索引が同時に問合せに関与している場合、索引を削除しようとすると失敗します。索引を削除する前に、ユーザーはDISCONNECT文でデータベースからデタッチする必要があります。Oracle Rdbが最初に索引などのオブジェクトにアクセスすると、そのオブジェクトにロックがかけられ、ユーザーがそのデータベースを終了するまで解除されません。このオブジェクトを更新しようとすると、他のユーザーのこのオブジェクトへのアクセスが最適化されているため、LOCK CONFLICT ON CLIENTメッセージが表示されます。
同様に、索引の削除中、DROP文に対してCOMMIT文またはROLLBACK文を使用してトランザクションを完了するまで、ユーザーはその索引に関連する問合せを実行できません。実行しようとすると、LOCK CONFLICT ON CLIENTエラー・メッセージが表示されます。- CASCADEを使用すると、この索引を参照する記憶域マップが暗黙的にNO PLACEMENT VIA INDEX記憶域マップに変更されます。
- 削除中の索引を参照する問合せアウトラインは、DROP INDEXコマンドのRESTRICTオプションおよびCASCADEオプションの両方に対して無効とマークされます。
- マルチスキーマ・データベースでは、暗黙的にDROP INDEX ... CASCADE文を使用してDROP SCHEMA ... CASCADE文をサポートします。Oracle Rdbの旧バージョンでは、記憶域マップが削除対象の索引を参照する場合、この文は失敗します。
例1: デフォルト・データベースからの索引の削除
SQL> ATTACH 'FILENAME personnel'; SQL> DROP INDEX DEG_COLLEGE_CODE; SQL> COMMIT;
例2: いずれかのアタッチ・データベースからの索引の削除
SQL> ATTACH 'FILENAME personnel'; SQL> ATTACH 'ALIAS MF FILENAME mf_personnel'; SQL> ATTACH 'ALIAS CORP FILENAME corporate_data'; SQL> SET QUOTING RULES 'SQL99'; SQL> DROP INDEX "CORP.ADMINISTRATION".PERSONNEL.EMP_EMPLOYEE_ID; SQL> COMMIT;
Oracle Rdbデータベースからモジュールを削除します。
DROP MODULE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
CASCADE
SQLで、モジュール内のルーチンを参照するすべてのオブジェクトを無効にし、その後、そのモジュール定義を削除するように指定します。これはカスケード削除と呼ばれます。ルーチンまたは言語セマンティクス依存性のあるストアド・ルーチンで参照されるモジュールを削除する場合、対象となるストアド・ルーチンも無効としてマークされます。IF EXISTS
被参照オブジェクトがデータベースに存在しない場合に、SQLコマンド言語によってエラー・メッセージが表示されないようにします。module-name
モジュールの名前を識別します。RESTRICT
ファンクションまたはプロシージャがOracle Rdbデータベース内の他のオブジェクトによって参照される場合、ストアド・ルーチン定義の削除を回避します。デフォルトはRESTRICTです。
- この文を実行するには、削除対象のモジュールに対するDROP権限が必要です。
- ストアド・モジュールのプロシージャまたはファンクション内のオブジェクトが、同時に問合せに関与している表にある場合、モジュールを削除しようとすると失敗します。モジュールを削除する前に、ユーザーはDISCONNECT文でデータベースからデタッチする必要があります。SQLが最初にモジュールなどのオブジェクトにアクセスすると、そのオブジェクトにロックがかけられ、ユーザーがそのデータベースを終了するまで解除されません。
このオブジェクトを更新しようとすると、他のユーザーがこのオブジェクトにアクセスしているため、「lock conflict on client」のメッセージが表示されます。
同様に、モジュールの削除中、DROP文に対してCOMMIT文またはROLLBACK文を使用してトランザクションを完了するまで、ユーザーはモジュールのプロシージャまたはファンクションに関連する問合せを実行できません。実行しようとすると、LOCK CONFLICT ON CLIENTエラー・メッセージが表示されます。- その定義によってストアド・ファンクションが起動されるCOMPUTED BY列が表にあり、そのストアド・ファンクションが削除対象になっている場合、その列はCOMPUTE NULLに設定されます。
- ストアド・ルーチンを無効にしてモジュールを削除し、その後そのモジュールを再定義する場合、無効なルーチンを使用すると、ルーチン参照を再度有効にしようとします。このようなモジュールを再度有効にする場合は、ALTER MODULE文を使用します。
例1: Oracle Rdbデータベースからのモジュールの削除
SQL> DROP MODULE employee_salary;
例2: DROP MODULE ... CASCASEアクションの確認
この例は、削除対象のモジュールと、ルーチンやトリガーなどの他のデータベース・オブジェクトの間に依存性が存在する可能性があることを示します。スクリプトでWARN_INVALIDオプションを指定してSET FLAGSを使用すると、データベース管理者には対象となるオブジェクトが通知されます。この場合は、アプリケーション環境に悪影響を及ぼす可能性があるため、ロールバックを使用してDROP MODULE ... CASCADEを取り消します。
SQL> start transaction read write; SQL> SQL> create module FIRST_MODULE cont> function GET_TIME () cont> returns TIME (2); cont> return CURRENT_TIME (2); cont> end module; SQL> SQL> create module SECOND_MODULE cont> procedure PRINT_TRACE (in :arg varchar(40)); cont> begin cont> trace GET_TIME(), ': ', :arg; cont> end; cont> end module; SQL> SQL> create table SAMPLE_TABLE cont> (ident integer, cont> descr char(100)); SQL> create trigger SAMPLE_TABLE_TRIGGER cont> after insert on SAMPLE_TABLE cont> (trace GET_TIME(), ': ', SAMPLE_TABLE.descr) cont> for each row; SQL> SQL> commit; SQL> SQL> set flags 'warn_invalid'; SQL> drop module FIRST_MODULE restrict; %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-E-OBJ_INUSE, object "GET_TIME" is referenced by SAMPLE_TABLE_TRIGGER. (usage: Trigger) -RDMS-E-MODNOTDEL, module "FIRST_MODULE" has not been deleted SQL> drop module FIRST_MODULE cascade; ~Xw: Trigger "SAMPLE_TABLE_TRIGGER" marked invalid ~Xw: Routine "PRINT_TRACE" marked invalid SQL> SQL> rollback;