Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

DROP TABLE (SQL)

テーブルおよび (オプションで) データを削除します。

Synopsis

DROP TABLE [IF EXISTS] table 
     [RESTRICT | CASCADE] [%DELDATA | %NODELDATA]

引数

IF EXISTS オプション — 存在しないテーブルに対してコマンドが実行される場合にエラーを抑制します。詳細は、存在しないテーブルに関する以下のセクションを参照してください。
table 削除するテーブルの名前。 テーブル名は修飾 (schema.table)、未修飾 (table) のどちらでもかまいません。テーブル名が未修飾の場合は、既定のスキーマ名が使用されます。スキーマ検索パスの値は使用されません。

RESTRICT

CASCADE

オプション — RESTRICT を指定すると、従属ビューや整合性制約のないテーブルのみが削除されます。キーワードが指定されていない場合は、RESTRICT が既定になります。CASCADE により、従属ビューや整合性制約のあるテーブルを削除でき、テーブル削除処理の一環として、参照しているビューまたは整合性制約もすべて削除されます。外部キー制約では、CASCADE キーワード・オプションはサポートされません。

%DELDATA

%NODELDATA

オプション — これらのキーワードは、テーブルの削除時に、テーブルに関連付けられているデータを削除するかどうかを指定します。既定では、テーブル・データを削除します。

概要

DROP TABLE コマンドは、テーブルとそれに対応する永続クラス定義を削除します。テーブルがそのスキーマの最後の項目である場合、テーブルを削除すると、スキーマとそれに対応する永続クラス・パッケージも削除されます。

既定では、DROP TABLE は、テーブル定義とテーブルのデータ (ある場合) の両方を削除します。%NODELDATA キーワードを使用すると、テーブル定義を削除し、テーブルのデータを削除しないことを指定できます。

DROP TABLE は、テーブルに関連付けられているすべてのインデックスとトリガを削除します。

テーブルを削除するには、以下の条件を満たす必要があります。

  • テーブルは、現在のネームスペースに存在している必要があります。存在しないテーブルを削除しようとすると、SQLCODE -30 エラーが生成されます。

  • テーブル定義は変更可能でなくてはなりません。テーブルを投影するクラスが [DdlAllowed] なしで定義されている場合は、テーブルを削除しようとすると SQLCODE -300 エラーが生成されます。

  • テーブルが別の同時プロセスでロックされていてはなりません。テーブルがロックされている場合は、DROP TABLE はロックから解放されるまで無制限に待機します。ロックの競合の可能性がある場合は、テーブルに対して IN EXCLUSIVE MODE でLOCK を実行してから DROP TABLE を発行することが重要です。

  • テーブルに関連付けられているビューがあってはなりません。また、DROP TABLE に CASCADE キーワードを指定する必要があります。CASCADE を指定せずにテーブルと関連付けられたビューを削除しようとすると、SQLCODE -321 エラーが生成されます。

  • テーブルを削除するには、必要な特権を持っている必要があります。特権を持たずにテーブルを削除しようとすると、SQLCODE -99 エラーが生成されます。

  • 対応するクラスが導入済みのクラスとして定義されていても、テーブルを削除できます

  • テーブルを投影する永続クラスに 派生クラス (サブクラス) がある場合、テーブルは削除できません。スーパークラスを削除しようとする (サブクラスが孤立したままになる) と、SQLCODE -300 エラーが生成され、"クラス 'MySuperClass' に派生クラスがあるため、DDL を介して削除できません" というメッセージが返されます。

$SYSTEM.SQL.Schema.DropTable()Opens in a new tab メソッドを使用して、現在のネームスペース内の 1 つのテーブルを削除できます。SQL テーブル名を指定します。DROP TABLE とは異なり、このメソッドは、[DdlAllowed] なしで定義されたテーブルを削除できます。2 番目の引数は、テーブル・データを削除するかどうかを指定します。既定では、データは削除されません。

  DO $SYSTEM.SQL.Schema.DropTable("Sample.MyTable",1,.SQLCODE,.%msg)
  IF SQLCODE '= 0 {WRITE "SQLCODE ",SQLCODE," error: ",%msg}

$SYSTEM.OBJ.Delete()Opens in a new tab メソッドを使用して、現在のネームスペース内の 1 つ以上のテーブルを削除できます。テーブルを投影する永続クラス名 (SQL テーブル名ではなく) を指定する必要があります。ワイルドカードを使用して複数のクラス名を指定できます。2 番目の引数は、テーブル・データを削除するかどうかを指定します。既定では、データは削除されません。

特権

DROP TABLE コマンドは特権を必要とする操作です。DROP TABLE を実行するには、ユーザは %DROP_TABLE 管理特権を持っている必要があります。持っていない場合、SQLCODE –99 エラーが発生し、%msg が "ユーザは %DROP_TABLE 特権を持っていません" に設定されます。適切な付与特権を持っている場合は、GRANT コマンドを使用して %DROP_TABLE 特権を割り当てることができます。

DROP TABLE 操作でテーブルとテーブル・データの両方を削除する場合でも、ユーザは指定のテーブルに対する DELETE オブジェクト特権を持っている必要はありません。

埋め込み 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 が削除できないデータ (参照制約のある行など) を検出した場合、既に実行されたデータの削除が自動的にロールバックされ、テーブル・データは何も削除されません。

$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドの DDLDropTabDelData オプションを使用して、テーブル・データの削除に関するシステム全体の既定値を設定できます。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[DDL DROP TABLEがテーブルのデータを削除する] の設定が表示されます。

既定は 1 (“はい”) です。この設定を推奨します。テーブル定義の削除時に、DROP TABLE でテーブルのデータを削除しない場合は、このオプションを 0 (“いいえ”) に設定します。

データの削除に関する設定は、テーブルごとにオーバーライドできます。テーブルの削除時に、DROP TABLE に %NODELDATA オプションを指定すると、テーブル・データが自動的に削除されるのを防止できます。システム全体の既定値がテーブル・データを削除しないように設定されている場合、DROP TABLE に %DELDATA オプションを指定すると、テーブルごとにデータを削除できます。

ほとんどの場合、DROP TABLE は、非常に効率的な kill extent 操作を使用して、テーブルのデータを自動的に削除します。テーブルにそのテーブルを参照する外部キーがある、テーブルを投影するクラスが永続クラスのサブクラスである、クラスが既定のストレージを使用しない、ForEach = "row/object" トリガがある、既定でないストリーム・フィールドのグローバル位置を参照するストリーム・フィールドがあるなどの場合、kill extent は使用できません。いずれかが当てはまる場合、DROP TABLE はあまり効率的ではないレコード削除操作を使用して、テーブルのデータを削除します。

TRUNCATE TABLE コマンドを使用すると、テーブル定義を削除せずに、テーブルのデータを削除できます。

適用されるロック

DROP TABLE 文は、table に対してテーブル・レベルの排他ロックを取得します。これにより、他のプロセスはテーブル削除の実行中にこのテーブルの定義やデータを変更できなくなります。テーブルの定義およびデータの削除に対してはこのテーブル・レベル・ロックで十分なので、DROP TABLE によってテーブル・データの各行のロックが取得されることはありません。このロックは、DROP TABLE 操作が終了すると自動的に解除されます。

外部キー制約

既定では、削除対象のテーブルを参照する別テーブルに外部キー制約が定義されている場合、そのテーブルは削除できません。参照されているテーブルを削除する前に、それを参照しているすべての外部キー制約を削除する必要があります。これらの外部キー制約を削除せずに DROP TABLE 操作を実行すると、SQLCODE -320 エラーが返されます。

外部キー制約での既定の動作は、RESTRICT キーワード・オプションと同じです。この制約では、CASCADE キーワード・オプションはサポートされません。

この既定の外部キー制約の動作を変更するには、"SET OPTION" コマンドの "COMPILEMODE=NOCHECK" オプションを参照してください。

関連付けられたクエリ

テーブルを削除すると、自動的にすべての関連クエリ・キャッシュが削除され、%SYS.PTools.StatsSQLOpens in a new tab によって生成されたクエリ情報が削除されます。テーブルを削除すると、関連する全クエリのすべての SQL 実行時統計 (SQL Stats) 情報が自動的に削除されます。

存在しないテーブル

指定のテーブルが現在のネームスペースに存在するかどうかを確認するには、$SYSTEM.SQL.Schema.TableExists()Opens in a new tab メソッドを使用します。

既定では、存在しないテーブルを削除しようとすると、DROP TABLE は SQLCODE -30 エラーを発行します。これが推奨設定です。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[存在しないテーブルまたはビューの DDL DROP を許可する] 設定が表示されます。既定値は 0 (“いいえ”) です。このオプションを 1 (“はい”) に設定した場合、存在しないテーブルに対する DROP TABLE は処理を実行せず、エラー・メッセージも発行しません。

管理ポータル、[システム管理][構成][SQL とオブジェクトの設定][SQL] から [冗長な DDL ステートメントを無視] チェック・ボックスにチェックを付けることにより、このオプション (および他の同様の作成、変更、および削除のオプション) をシステム全体で設定できます。これらの設定の詳細は、SQL 構成パラメータに関するページを参照してください。

述語 IF EXISTS の動作が、上記の設定よりも優先されます。これらの設定によって SQLCODE 0 が返され、通知なしでエラーが抑制されます。IF EXISTS を指定していると、このコマンドからはメッセージと共に SQLCODE 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 }

関連項目

FeedbackOpens in a new tab