データベース千夜一夜第33回

データ定義命令(1)~テーブルの作成・削除・変更 長谷川裕行
有限会社 手國堂

データ定義文

前回までに紹介してきたSQLは、データ操作文(DML文)とデータ制御文(DCL文)に属するものでした。ここからは「データ定義文」と「データ定義命令」について紹介します。


- 操作・制御とは異なる定義命令 -

ストアドプロシージャとユーザー定義関数の解説で、CREATE、ALTER、DROPの3つの命令──主にCREATE命令──を紹介しましたが、詳しい機能には触れませんでした。

これらの命令を使ったSQL文は前述したようにデータ定義文(DDL文)と呼ばれ、他の2種類(データ操作とデータ制御)のSQL文とは少し趣が異なります。操作の対象がテーブルやレコード、フィールドの値など具体的なデータではなく、データベースを構成するオブジェクトなので、データを扱っているというイメージは抱きにくいかもしれません。

しかしまた、具体的なデータの入れ物であるテーブル、データの操作を記録したビューやストアドプロシージャなどのオブジェクトも、処理全体から見ればデータ(操作の対象となる情報)であることに変わりはありません。

データ定義文では、テーブルに記録される直接的なデータではなく、データベースとその構成要素そのものを作ったり削除したりできます。


- データ定義文の種類 -

データ定義文は、大きく以下の2つに分類できます。

a)オブジェクトの生成に関するもの

b)オブジェクトの操作権限に関するもの

繰り返しますが、「オブジェクト」とは「データベース/ダイアグラム/テーブル/ビュー/ストアドプロシージャ/ユーザー定義関数」などデータベースそのものとデータベースを構成する各種要素を指します。

さらに「a)オブジェクトの生成に関するもの」にはオブジェクトの「生成/変更/削除」の3つが、「b)オブジェクトの操作権限に関するもの」には操作権限の「付与/削除」の2つがあります。

これら5つの命令の概要を紹介しておきましょう。


- a)オブジェクトの生成に関するもの -

・オブジェクトの生成~CREATE命令

オブジェクトを生成するにはCREATE命令を使います。書式は以下のようになります。

  CREATE <オブジェクト種類> <オブジェクト名> <定義>

<オブジェクト種類>で生成するオブジェクトの種類(DATABASE、TABLE、VIEW、PROCEDUREなど)を、<オブジェクト名>でそのオブジェクトの名前を定義し、<定義>でそのオブジェクトの具体的な形態や構成を定義します。<定義>はオブジェクトの種類によって異なります。

・オブジェクトの変更~ALTER命令

既存のオブジェクトの内容を書き換えるにはALTER命令を使います。書式は以下のようになります。

  ALTER <オブジェクト種類> <オブジェクト名> <定義>

<オブジェクト種類>で内容を書き換えたいオブジェクトの種類(DATABASE、TABLE、VIEW、PROCEDUREなど)を、<オブジェクト名>で内容を書き換えたいオブジェクトの名前を指定し、<定義>でそのオブジェクトの新しい形態や構成を定義します。<定義>はオブジェクトの種類によって異なります。

・オブジェクトの削除~DROP

既存のオブジェクトを削除するにはDROP命令を使います。書式は以下のようになります。

  DROP <オブジェクト種類> <オブジェクト名>

<オブジェクト種類>で内容を書き換えたいオブジェクトの種類(DATABASE、TABLE、VIEW、PROCEDUREなど)を、<オブジェクト名>で削除したいオブジェクトの名前を指定します。

実行すると、指定したオブジェクトがデータベースから削除されます。


- 厳密な意味での「命令語」について -

CREATE、ALTER、DROPは厳密には単独の命令ではなく、生成・変更・削除対象のオブジェクト種類を合わせて“CREATE TABLE”“DROP PROCEDURE”のような形で1つの独立した命令となります。

しかし、オブジェクト種類を除けば基本的な書式は共通するため、ここではCREATE、ALTER、DROPという基本命令にオブジェクト種類を指定して最終的な命令を形成する──という形で説明しています。

Transact-SQLのヘルプでは、上述のように“CREATE TABLE”などオブジェクト種類を続けた形でキーワードが登録されているため、検索時には注意してください。


- b)オブジェクトの操作権限に関するもの -

・権限の付与~GRANT命令

SQLの命令を実行できる権限を特定のユーザーに与えます。

書式は以下のようになります。

  GRANT <命令リスト> TO <ユーザー>

<命令リスト>にはSQLの命令群を「,」で区切って列挙できます。“ALL”を指定すると、すべての命令が実行権限付与の対象になります。ここで指定した命令群の実行権限を、<ユーザー>で示したユーザーに付与します。

<ユーザー>には「,」区切りのユーザー名(データベースへのログイン名)リストの他、ユーザーグループも指定できます。

例えば、DROP TABLE命令とDROP VIEW命令の実行権限をユーザー「taro」に与えるなら、以下のようなSQLを記述します。

  GRANT DROP TABLE, DROP VIEW TO taro

<命令リスト>に“ALL”を指定した場合の「すべての命令」は、GRANT命令を実行したユーザーの属する権限グループ(ロール)によって以下のように変わります。

実行したユーザーがsysadminの場合
SELECTやDELETEなどのデータ操作命令と、CREATEやDROPなどのデータ定義命令の両方に対して権限を与えることができます。

実行したユーザーがdb_ownerまたは対象となるオブジェクトの所有者の場合
CREATEやDROPなどのデータ定義命令のみに対して権限を与えることができます。

・権限の削除~REVOKE命令

特定のユーザーから、SQLの命令を実行できる権限を削除(剥奪)します。

書式は以下のようになります。

  REVOKE <命令リスト> FROM <ユーザー>

<命令リスト>にはSQLの命令群を「,」で区切って列挙できます。“ALL”を指定すると、すべての命令が実行権限削除の対象になります。ここで指定した命令群の実行権限を、<ユーザー>で示したユーザーから削除します。

<ユーザー>には「,」区切りのユーザー名(データベースへのログイン名)リストの他、ユーザーグループも指定できます。

例えば、ユーザー「taro」からDROP TABLE命令とDROP VIEW命令の実行権限を削除するなら、以下のようなSQLを記述します。

  REVOKE DROP TABLE, DROP VIEW FROM taro


- トランザクションとデータ定義命令 -

データ定義命令もトランザクション管理の対象になります。

先のデータ制御文(DCL文)のところで、UPDATEやDELETEなどのデータ操作命令の他、ここで紹介したCREATEやDROPなどのデータ定義命令もその対象となることを説明しました。

つまり、BEGIN TRANでトランザクションを開始しておけば、DELETE命令でオブジェクトを削除した後にROLLBACK命令を発行してそれを取り消し、削除されたオブジェクトを復活することも可能なのです。

もちろん、CREATE命令によるオブジェクトの生成を取り消すことも、ALTER命令で書き換えたオブジェクトの内容を書き換える前に戻すこともできます。GRANTによる権限の付与やREVOKEによる権限の削除も同じです。

なお、UPDATEやINSERT、DELETEのデータ操作命令とCREATE、DROP、ALTER(ALTER命令は対象がTABLEの場合のみ)、GRANT、REVOKEのデータ定義命令は、特にBEGIN TRAN命令を実行しなくても暗黙のうちにトランザクション管理が開始され、次のSQL命令が実行される直前に自動的にコミット(確定)されます。

つまり、特にトランザクション管理を開始しなくても、次のSQLを実行する前ならROLLBACK命令で操作を取り消せる、ということです。



トップページ
データ定義命令について
データ定義文
操作・制御とは異なる定義命令
データ定義文の種類
a)オブジェクトの生成に関するもの
厳密な意味での「命令語」について
b)オブジェクトの操作権限に関するもの
トランザクションとデータ定義命令
テーブルの作成・削除・変更
一時テーブルの作成
あとがき
Copyright © GrapeCity inc. All rights reserved.