Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

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 オプションを指定します。

テーブル・データの削除に関するシステム全体の既定値は、以下のように設定できます。

既定値は “はい” (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 }

関連項目

FeedbackOpens in a new tab