DROP TABLE
Synopsis
DROP TABLE table
[RESTRICT | CASCADE] [%DELDATA | %NODELDATA]
引数
table | 削除するテーブルの名前。 |
RESTRICT CASCADE |
オプション — RESTRICT を指定すると、従属ビューや整合性制約のないテーブルのみが削除されます。CASCADE により、従属ビューや整合性制約のあるテーブルを削除でき、テーブル削除処理の一環として、参照しているビューまたは整合性制約もすべて削除されます。(後述の CASCADE に関する制約を参照)。 |
%DELDATA %NODELDATA |
オプション — これらのキーワードは、テーブルの削除時に、テーブルに関連付けられているデータを削除するかどうかを指定します。既定では、テーブル・データを削除します。 |
概要
DROP TABLE コマンドはテーブルを削除します。既定では、テーブル定義とテーブルのデータ (ある場合) を削除します。%NODELDATA キーワードを使用すると、テーブル定義を削除し、テーブルのデータを削除しないことを指定できます。
テーブルを削除するには、以下の条件を満たす必要があります。
-
テーブルは、現在のネームスペースに存在している必要があります。存在しないテーブルを削除しようとすると、SQLCODE -30 エラーが生成されます。
-
テーブル定義は変更可能でなくてはなりません。テーブルを投影するクラスが DllAllowed なしで定義されている場合は、テーブルを削除しようとすると SQLCODE -300 エラーが生成されます。
-
テーブルが別の同時プロセスでロックされていてはなりません。テーブルがロックされている場合は、DROP TABLE はロックから解放されるまで無制限に待機します。ロックの競合の可能性がある場合は、テーブルに対して IN EXCLUSIVE MODE でLOCK を実行してから DROP TABLE を発行することが重要です。
-
テーブルを削除するには、必要な特権を持っている必要があります。特権を持たずにテーブルを削除しようとすると、SQLCODE -99 エラーが生成されます。
この文は $SYSTEM.SQL.DropTable()Opens in a new tab メソッド呼び出しで呼び出すこともできます。
$SYSTEM.SQL.DropTable(tablename,deldata,SQLCODE,%msg)
特権
DROP TABLE コマンドは特権を必要とする操作です。DROP TABLE を使用する前に、%DROP_TABLE 管理者特権または指定されたテーブルに対する DELETE オブジェクト特権があることを確認する必要があります。特権がない場合は、SQLCODE -99 エラー (特権違反) が返されます。%CHECKPRIV コマンドを呼び出すことにより、現在のユーザが DELETE 特権を持っているかどうかを確認できます。$SYSTEM.SQL.CheckPriv()Opens in a new tab メソッドを呼び出すことにより、指定のユーザが DELETE 特権を持っているかどうかを確認できます。適切な特権を持っている場合は、GRANT コマンドを使用して %DROP_TABLE 特権を割り当てることができます。
埋め込み SQL では、以下のように $SYSTEM.Security.Login()Opens in a new tab メソッドを使用して適切な特権を持ったユーザとしてログインできます。
DO $SYSTEM.Security.Login("_SYSTEM","SYS")
&sql( )
$SYSTEM.Security.Login メソッドを呼び出すには、%Service_Login:Use 特権が必要です。詳細は、"インターシステムズ・クラス・リファレンス" の "%SYSTEM.SecurityOpens in a new tab" を参照してください。
DROP TABLE は、テーブル・クラスの定義に [DdlAllowed] が含まれている場合を除き、永続クラスを定義して作成したテーブルでは使用できません。使用すると、操作は SQLCODE -300 エラーで失敗し、%msg が “DDL がクラス schema.tablename に対して有効になっていません” に設定されます。
既存のオブジェクト特権
テーブルを削除しても、そのテーブルに対するオブジェクト特権は削除されません。例えば、そのテーブルでデータを挿入、更新、または削除するためにユーザに与えられた特権です。これには、以下のような 2 つの影響があります。
-
テーブルが削除され、同じ名前を持つ別のテーブルが作成されると、ユーザとロールは新しいテーブルでも古いテーブルで持っていたのと同じ特権を持ちます。
-
テーブルを削除しても、そのテーブルのオブジェクト特権を削除することはできません。
この理由により、通常はテーブルを削除する前に、REVOKE コマンドを使用して、テーブルからオブジェクト特権を削除することをお勧めします。
データを含むテーブル
既定では、DROP TABLE はテーブルのデータも削除します。このテーブル・データの削除はアトミック処理です。DROP TABLE が削除できないデータ (参照制約のある行など) を検出した場合、既に実行されたデータの削除が自動的にロールバックされ、テーブル・データは何も削除されません。
データの削除設定は、テーブル単位またはシステム全体でオーバーライドできます。テーブルの削除時に、DROP TABLE に %NODELDATA オプションを指定すると、テーブル・データが自動的に削除されるのを防止できます。既定のシステム構成設定では、テーブル・データは削除されます。テーブル・ベースでデータの削除を指定するには、システム全体の既定の設定でテーブル・データを削除しないように設定して、DROP TABLE に %DELDATA オプションを指定します。
テーブル・データの削除に関するシステム全体の既定値は、以下のように設定できます。
-
$SYSTEM.SQL.SetDDLDropTabDelData()Opens in a new tab メソッド呼び出し。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[DROP TABLE がデータを削除する] の設定が表示されます。
-
管理ポータルに進み、システム, 構成, 一般SQL設定 を選択します。[DDL DROP TABLE がテーブルのデータを削除する] の現在の設定を表示します。
既定値は “はい” (1) です。この設定を推奨します。テーブル定義の削除時に、DROP TABLE でテーブル・データを削除しない場合は、このオプションを “いいえ” (0) に設定します。
適用されるロック
DROP TABLE 文は、table に対してテーブル・レベルの排他ロックを取得します。これにより、他のプロセスはテーブル削除の実行中にこのテーブルの定義やデータを変更できなくなります。テーブルの定義およびデータの削除に対してはこのテーブル・レベル・ロックで十分なので、DROP TABLE によってテーブル・データの各行のロックが取得されることはありません。このロックは、DROP TABLE 操作が終了すると自動的に解除されます。
外部キー制約
既定では、削除対象のテーブルを参照する別テーブルに外部キー制約が定義されている場合、そのテーブルは削除できません。参照されているテーブルを削除する前に、それを参照しているすべての外部キー制約を削除する必要があります。これらの外部キー制約を削除せずに DROP TABLE 操作を実行すると、SQLCODE -320 エラーが返されます。
外部キー制約での既定の動作は、RESTRICT キーワード・オプションと同じです。この制約では、CASCADE キーワード・オプションはサポートされません。
この既定の外部キー制約の動作を変更するには、"SET OPTION" コマンドの "COMPILEMODE=NOCHECK" オプションを参照してください。
関連付けられたクエリ
テーブルを削除すると、自動的にすべての関連クエリ・キャッシュが削除され、%SYS.PTools.SQLQueryOpens in a new tab に保存されているクエリ情報が削除されます。テーブルを削除すると、関連する全クエリのすべての SQL 実行時統計 (SQL Stats) 情報が自動的に削除されます。
存在しないテーブル
指定のテーブルが現在のネームスペースに存在するかどうかを確認するには、$SYSTEM.SQL.TableExists()Opens in a new tab メソッドを使用します。
存在しないテーブルを削除しようとすると、DROP TABLE は既定で SQLCODE -30 エラーを発行します。ただし、システム構成を以下のように設定することにより、このエラー報告動作をオーバーライドできます。
-
$SYSTEM.SQL.SetDDLNo30()Opens in a new tab メソッド呼び出し。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[SQLCODE=-30 エラーの抑制] の設定が表示されます。
-
管理ポータルに進み、システム, 構成, 一般SQL設定 を選択します。[存在しないテーブルまたはビューの DDL DROP を許可する] の現在の設定を表示します。
既定値は “いいえ” (0) です。この設定を推奨します。存在しないテーブルに対して DROP TABLE の処理をせず、エラー・メッセージも発行しない場合は、“はい” (1) に設定します。
例
以下の埋め込み SQL の例では、SQLUser.MyEmployees という名前のテーブルを作成し、後でそれを削除しています。この例では、テーブルの削除時に、このテーブルに関連付けられているデータを削除しないことを指定しています。
&sql(CREATE TABLE SQLUser.MyEmployees (
NAMELAST CHAR (30) NOT NULL,
NAMEFIRST CHAR (30) NOT NULL,
STARTDATE TIMESTAMP,
SALARY MONEY))
WRITE !,"Created a table"
/*
&sql(SQL code populating SQLUser.MyEmployees table)
&sql(SQL code using SQLUser.MyEmployees table)
*/
NEW SQLCODE,%msg
&sql(DROP TABLE SQLUser.MyEmployees %NODELDATA)
IF SQLCODE=0 {WRITE !,"Table deleted"}
ELSE {WRITE !,"SQLCODE=",SQLCODE,": ",%msg }
関連項目
-
"Caché SQL の使用法" の “テーブルの定義” の章
-
"Caché 詳細構成設定リファレンス" で説明されている SQL 構成設定
-
"Caché エラー・リファレンス" にリストされた SQLCODE エラー・メッセージ