The データ定義言語(DDL)コマンドはデータベースの構造を取り扱う コマンドです。利用可能なDDLコマンドの要約を以下に示します。
Table 4-1: データ定義言語コマンド
コマンド | 概要 |
CREATE TABLE | テーブル名、およびフィールドの各々の名前およびデータタイプを含むテーブル を作成します。 |
DROP TABLE | 既存のテーブルを削除します。 |
ALTER TABLE | レコードをダンプおよび再ロードせずに既存のテーブルの構造を変更します。 またテーブルのチェックサムを変更したり、レプリケーションのテーブルタイプを 定義したり、トリガを有効にしたり無効にしたりすることを含みます。 |
RENAME | テーブルまたはフィールドの名前を変更します。 |
DISPLAY TABLE | テーブルの構造を表示します。 |
CREATE INDEX | フィールドの検索を援助するメカニズムをセットアップします。 |
DROP INDEX | フィールド上のインデックスを削除します。 |
CREATE RANGE CHECK | フィールドのデータ確認検査をセットアップします。 |
DROP RANGE CHECK | フィールドのデータ確認検査を削除します。 |
CREATE REFERENTIAL | フィールドのデータに参照制約をセットアップします。 |
DROP REFERENTIAL | フィールドからデータの参照制約を削除します。 |
CREATE VIEW | 1つ以上のテーブルのフィールドから論理的なテーブルを作成します。 |
DROP VIEW | 論理的なテーブルを削除します。 |
CREATE COMMENT | テーブル、フィールド、モジュールあるいはトリガにコメントを付けます。 |
DROP COMMENT | テーブル、フィールド、モジュールあるいはトリガに関するコメントを削除します。 |
DISPLAY PRIVILEGE | テーブルのためのアクセス権を表示します。 |
DISPLAY GRANT PRIVILEGE | テーブルに対する特権許可オプションを表示します。 |
GRANT PRIVILEGE | テーブルまたはフィールドのアクセス権を変更します。 |
REVOKE PRIVILEGE | テーブルまたはフィールドのアクセス権を削除します。 |
LOCK LEVEL | テーブル上でロックするレベルをセットします。 |
CREATE MODULE | データディクショナリーへパーシスタント・ストアド・モジュールの定義を 作成します。 |
UPDATE MODULE | パーシスタント・ストアド・モジュール定義をモジュールシェアードライブラリ とリンクします。 |
DROP MODULE | データディクショナリーからパーシスタント・ストアド・モジュール定義を 取り除きます。 |
DISPLAY MODULE | パーシスタント・ストアド・モジュール定義を表示します。 |
CREATE TRIGGER | データディクショナリーへトリガをセットアップします。 |
DROP TRIGGER | データディクショナリーからトリガを取り除きます。 |
DISPLAY DATABASE | データベース中のテーブルを表示します。 |
CREATE TABLEコマンドはデータベースの中にテーブルを作成します。それは テーブル名を指定し、そのフィールド名を指定し、データタイプの各属性の指定および テーブルの配置位置を含んでいます。もし指定されなければ、オプションは合理的な 初期値が与えられます。
CREATE [TABLE] table [| (item {, item} [,constr {,constr}]) |] |SET item {, item} [,constr {,constr}] | [LOCATE [IN] location];
CREATE [TABLE] table [LOCATE [IN] location][FROM file];
説明
item | attr [data_type [(param {,param})] [[NOT] NULL] [attr_constr]] |
constr | プライムキーと外部キー制約条件です。次のうちの1つです。
|
location | 既存のディレクトリー名を指定します。ディレクトリー用の任意の有効な システムパスネームです。全てのファイルが指定されることを推奨します。 位置の指定にキーワードあるいは空のストリング("")で 指定された場合、テーブルは現在のデータベースディレクトリーに作成されます。 |
data_type | table 4-2にリストされたうちの1つで、パラメータは括弧で囲まれます。 data_typeが指定されない場合はINTEGERになります。 |
attr_const | プライムキーと外部キー制約条件です。次のうちの1つです。
|
Table 4-2: データタイプパラメータと省略値
データタイプ | パラメータ | 省略値 |
CHAR | (長さ, タイプ) | (25,1) |
BULK | (表示長, プライマリ記憶長, オーバーフロー記憶長, エキステントへのポインタ数) |
(20,20,20,1) |
TEXT | (表示長, プライマリ記憶長, オーバーフロー記憶長, エキステントへのポインタ数) |
(20,20,20,1) |
DATE | (フォーマットタイプ) | (0) |
TIME | (フォーマットタイプ) | (0) |
MICROTIMESTAMP | (フォーマットタイプ) | (0) |
DECIMAL | (最大の数, 小数位の数) | (1,0) |
DOLLAR | (最大のドル数字, フォーマットタイプ) | (4,1) |
REAL | (精度) | (n) * |
FLOAT | N/A | N/A |
LONGFLOAT | N/A | N/A |
SHORTINTEGER | N/A | N/A |
INTEGER | N/A | N/A |
LONGINTEGER | N/A | N/A |
パラメータが指定されない場合、省略値が適用されます。
* nは、マシンのFLOATの精度に依存します。
詳細は、Data Typesを参照して ください。
指定された位置がキーワードDBあるいは空のストリング("")で ある場合、それは現在のデータベースディレクトリを参照します。
指定するディレクトリには、1つのデータベースのみからのテーブルであること が重要です。2つ以上のデータベースからのテーブルを保持するためにディレクトリを 使用することは、データファイルを破壊する恐れがあります。
テーブルの位置は、ALLオプションを指定したDISPLAY TABLE コマンドで参照することができます。
既存のテーブルはALTER TABLEコマンドを使用して再配置することが 可能です。
Empressによって提供されるインポート/エキスポートは、テーブルの位置 を保持しません。インポートする場合には、テーブルは全てデータベースディレクトリ に作成されます。テーブルをが再配置する必要があります。
オペレーティングシステムコマンドを使用して、データベースディレクトリを削除 することにより、リモートテーブルのないデータベースを削除することができますが、 リモートテーブルがあるデータベースの場合にはemprmdbユーティリィティで 削除しなくてはなりません。これは、データベースに関連したオペレーティング システムファイルがすべて削除されることを保証します。 このユティリティは、Empress: Manual Pagesを参照してください。
簡単なテーブルの作成
フィールドnumber、name、phone、 credit_limitを持ったテーブルpersonnelを定義するために、 numberは32767までの整数を保持することができるように、nameは 25文字まで、phoneは15文字まで、credit_limiは999,999.99ドル まで保持することができるように作成します。
CREATE | TABLE personnel ( number INTEGER, name CHAR (25,1), phone CHAR (15,1), credit_limit DOLLAR (6,1)); |
numberはINTEGERとして、nameとphoneは 最大の長さ25および15のCHARタイプ1として各々定義されます。 credit_limitは6桁のドルを格納することができるDOLLARとして 定義されます。
フィールド名がEmpressキーワードである場合のテーブルを作成します。
date, amountというフィールド名を持つテーブルloans を定義するには、次の用に作成します。
CREATE | TABLE loans ( number INTEGER, name CHAR (25,1), date DATE (1), amount DOLLAR (6,1)); |
numberはINTEGERとして、nameは25の最大の長さの CHARタイプ1として定義されます。 dateはDATEタイプ1として、amountは6桁のドルを格納 することができるDOLLARとして定義されます。
name、dateがEmpressキーワードであることに注意して ください。そのようなフィールド名は複雑な名として扱ってください。
複雑な名前を持ちNULLデータの入力を無効としたテーブルを作成 します。
"auto parts"テーブルを定義するには、次のように指定します。
CREATE | TABLE "auto parts" ( supplier CHAR (20, 1) NOT NULL, phone CHAR (8, 1), ATTR "part name" CHAR (15, 1), ATTR "part no." LONGINTEGER, price DOLLAR (4, 1)); |
supplierにNOT NULLが指定されているので、各レコードで データが必ず入力されなくてはなりません。複雑なテーブル名およびフィールド名が 引用符で囲まれることに注意してください。
テキスト属性を備えたテーブルを作成します。
customersテーブルは1つのCHARと2つのTEXT データタイプ属性を含んでいます。nameをNOT NULLとして 定義することにより、顧客名が常に入力されることを確認してください。
CREATE | TABLE customers ( name CHAR (20, 1) NOT NULL, address TEXT (30, 124, 30, 1), comments TEXT (25, 0, 80, 1)); |
addressは1行30文字を4行表示させるために30の表示長、 プライマリ記憶長は124としています。120でなく124としているのは、各行の終わりに 改行コードがあるためです。オーバーフロー記憶長は30にしています。メインテーブル に4行文の十分な保存域があるので、オーバーフロー記憶はあまり使用されないと 思われますが長いアドレスの場合に使用されます。
commentsはは長さが一定ではないと予想されますので、この属性のために プライマリ記憶長を大きく指定することは意味がありません。この場合オーバー フロー記憶が使用されますので記憶長は、一般的な端末のスクリーンの幅に合わせ80 または80の倍数にするのがベストです。
DROP TABLEコマンドはデータベースからテーブルを削除します。 データベースからテーブルを削除することは、さらにそのレコードをすべて削除します。
DROP table;
DROP特権
テーブルpersonnelを削除するのは以下のコマンドを実行します。
DROP TABLE personnel;
ALTER TABLEコマンドは、既存のテーブルの構造を変更します。 これは次のものを含んでいます。
Syntax 1
ALTER [TABLE] table | [action { [:] action}]; |
Syntax 2
ALTER [TABLE] table LOCATE [IN] location;
Syntax 3
ALTER [TABLE] table | |ENABLE |DISABLE |
| | |
|ALL TRIGGERS |TRIGGER trigger {, trigger} |
|; | |
Syntax 4
ALTER [TABLE] table CHANGE TRIGGER trigger {, trigger} PRIORITY priority;
action | 以下の組み合わせ。
|ADD item {, item} [BEFORE attr]| |CHANGE item {, item} | |DELETE attr {, attr} | |ADD [|LONGVAR|] CHECKSUM | |RECORD | |DELETE [|LONGVAR|] CHECKSUM | |RECORD | |ADD constr1 | |DELETE constr2 | |
item | attr [data_type [(param {, param})] [[NOT] NULL]] |
constr1 | Primary KeyまたはForeign Keyで抑制。以下のいずれかです。
|
constr2 | いずれか1つ。
| PRIMARY KEY | | FOREIGN KEY [ON] (attr {, attr}) | |
location | 有効で存在するディレクトリ名。 |
data_type | 以下に示すTable 4-2の中のひとつ。パラメータは括弧で囲まれます。 data_typeが指定されない場合、省略値は INTEGERです。 |
trigger | 有効で存在するトリガ名。 |
priority | フロート番号。 例、 -1.2, 0, 1 , 2, 2.3 ... etc. 大きい数字 ほど優先度は高くなります。 |
注意
ALTER TABLEコマンドは新しいテーブルファイルを作成するので、新しい ファイルについてのUNIXアクセス権および所有権はumaskの設定(UNIXの)、および 所有者IDに依存します。
ALTER TABLEコマンドがデータタイプの属性を変更する場合、 ALTER TABLEが完了するためにはテーブル内の全レコードを変換しなければ なりません。新しいデータタイプに変換できないレコードがある場合、 ALTER TABLEは異常終了し、オリジナルのテーブルは変更されません。
ALTER TABLEコマンドがデータタイプの属性を変更する前に、フィールド から範囲チェックを削除します。範囲チェックはデータタイプと共に変換することが できません。
<CTRL+C>のようなキーボード割り込みを使用して、 ALTER TABLEコマンドを中断することができます。 ALTER TABLEオペレーションは"安全です"。それはデータベースを破損 する可能性なしで中断することができるからです。kill -9を使用しての 割り込みはデータベースを破損する恐れがあります。
トリガは使用しない場合は無効に、使用する場合は有効にできます。
多数のトリガが作成される場合、トリガ定義内の優先度は実行されるトリガの順序を 決定します。トリガが作成される場合、優先度は0.000にセットされます。 トリガの優先度を変更するALTER TABLEコマンドを使用してください。
データディクショナリーテーブルに対してALTER TABLEコマンドを 使用してはいけません。
必要な特権
ALTER特権
例
フィールドの追加
loansテーブルにデータタイプDATE(1)のdue_date という名前のフィールドを追加します。
ALTER | loans ADD due_date DATE (1); |
フィールドのプロパティを変更します。
loansテーブルのnameフィールドを、新しいフィールドの追加と 共に25バイトCHARから20バイトCHARに変更します。
ALTER | loans ADD due_date DATE (1) CHANGE name CHAR (20, 1); |
DISPLAY TABLEコマンドでテーブル構造を表示させると以下のように なります。
*** Table: loans *** Attributes: number integer name char(20,1) date date(1) amount dollar(6,1) due_date date(1)
RENAMEコマンドはテーブル名、フィールド名を変更します。
Syntax 1:
RENAME TABLE table [ | | TO | | AS | |
] new_table_name; |
Syntax 2:
RENAME ATTR[IBUTE] table.attr [ | | TO | | AS | |
] new_attr_name; |
説明
new_table_name | 有効なテーブル名。 |
new_attr_name | 有効なフィールド名。 |
注意
フィールド名を変更する場合、オリジナルのフィールド名にはテーブル名を 付加しなければなりません。しかし、変更後のフィールド名にはテーブル名を付加して はなりません。
テーブル名、フィールド名の変更は既存のトリガに影響はありません。 トリガは、新しい名前のもとで正確に自動的に機能します。
VIEWテーブル名もこのコマンドで変更することができます。
必要な特権
ALTER特権
例
テーブル名の変更
テーブル名personnelをemployeesに変更します。
RENAME personnel TO employees;
複雑なテーブル名の変更
テーブル名auto partsをpartsに変更します。
RENAME "auto parts" TO parts;
複雑なフィールド名の変更
フィールド名part no.をnumbersに変更します。
RENAME parts."part no." TO numbers;
簡単なフィールド名を複雑な名前に変更する。
テーブルpersonnelのフィールド名numberを employee numberに変更します。
RENAME personnel.number TO "employee number";
DISPLAY TABLEコマンドは、指定されたテーブルのフィールド名、 データタイプ、インデックス情報、コメント、範囲チェック、制約条件、 VIEWテーブルの場合は作成されたSELECT文などのテーブル情報を表示します。
DISPLAY table [ON [ATTR] | | attr |[NOT] match_op pattern |
|] | |
[ALL] [DUMP] | [ | |INTO |ONTO |
| file]; | |
説明
match_op | 次のいずれか1つLIKE、MATCH、!MATCH、 SMATCH、!SMATCHです。 |
pattern | WHERE句で指定するパターンです。引用符で囲む必要があります。 |
file | ファイル名。 |
注意
ALLオプションのないDISPLAY TABLEコマンドはフィールド 情報、コメント、インデックス情報、制約条件を表示します。ALLオプション を指定した場合はトリガ定義、フィールドに関するコメント、範囲チェック、作成者、 ロックレベル、チェックサム変数(Empress: Database Administrator's GuideのDirty Readを 参照してください)、テーブル番号、レコード・サイズ、レコード数を表示します。
特定のフィールドだけ表示したい場合には、ON attrあるいは パターンマッチング・オプションを使用してください。
DISPLAY TABLEコマンドにDUMPオプションが指定された場合、 出力は圧縮されダンプファイルからテーブルを作成するための情報を含んでいます。 ダンプファイル中の値は、Empressによって設定されたセパレータ文字によって 分離されます。この文字はEmpressシステム変数MSVALSEPによって 指定されます。セパレータの初期値は通常<Ctrl+V>(8進法26)です。
ファイルへダンプされた情報から新しいテーブルを作成する場合には、DUMP オプションを指定します。NULL値を受け入れるフィールドはnの値 が、受け入れない場合はyがダンプファイルに書き込まれています。
INTO fileあるいはONTO fileが指定された 場合、出力はターミナルへではなく指定されたファイルへ送られます。ONTO は既存ファイルに追加します。INTOは既存ファイルに上書きします。 どちらの場合もファイルが無い場合には作成します。
DISPLAY TABLEはVIEWテーブルにも使用できます。
テーブルサイズを取得するために、テーブルに対してDISPLAY ALLを 行います。テーブル番号を見つけ出し次に、対応するシステムファイルの ファイルサイズを見つけるシステムコマンドを使用します。例えば、UNIXでは、 コマンドls -lは、ファイルの詳細表示を行ないます。 テーブル番号が15である場合、テーブルに対応するファイル名は0015.rel になります。詳細表示にはファイルサイズをバイト単位で表示します。
必要な特権
DISPLAY特権
例
テーブル中の全てのフィールドを表示します。
loansテーブルのフィールドを表示します。
DISPLAY loans;
以下の表示を行ないます。
*** Table: loans *** Attributes: number integer name char(25,1) date date(1) amount dollar(6,1)
テーブルの詳細情報を表示します。
loansテーブルの作成者、ロックレベル、レコード数情報を含めて表示 します。
DISPLAY loans ALL;
以下の表示を行ないます。
*** Table: loans *** Attributes: number integer name char(25,1) date date(1) amount dollar(6,1) Creator: joe Lock Level: RECORD Table #: 8 Records: 12 Record size: 36
テーブル中の指定フィールドを表示します。
loansテーブルのnameフィールドを表示します。
DISPLAY loans ON name ALL;
以下のような表示を行ないます。
** Table: loans *** Attributes: name char(25,1) Creator: joe Lock Level: RECORD Table #: 8 Records: 12 Record size: 36
システムファイルへテーブル情報を保存します。
personnelテーブルの情報をファイルp_descへ保存します。
DISPLAY personnel INTO 'p_desc';
CREATE INDEXコマンドは、単一のフィールドまたは複数のフィールド上に インデックスと呼ばれるEmpressデータ構造を作成します。インデックスは、 フィールドへのアクセスを向上させます。インデックスは、TEXTと BULKのデータタイプのような可変長データには作成できません。
CREATE [ | |UNIQUE |DISTINCT |[(]primary[,] overflow[)] |
|] [index_method] INDEX [name] | | |
[ON] | |table (attr, {, attr}) |table SET (attr, {, attr}) |
|; | |
説明
name | ユーザによって指定されたインデックス名。 | |
primary | プライマリインデックスファイル中の、インデックスが付けられたフィールドへの ポインタの数。省略値はEmpress管理変数MSDBINDEXPRIMARYに2 と設定されています。 | |
overflow | オーバーフローインデックスファイル中の、インデックスが付けられたフィールド へのポインタ数。省略値はEmpress管理変数MSDBINDEXOVERFLOWに15 と設定されています。 | index_method |
省略値はBTREEです。 |
注意
DISTINCTはUNIQUEと同義語として使用されます。 UNIQUEが指定された場合、同一の値またはNULL値は許可されません。
複合インデックスは、2つ以上のフィールドに作成されます。
インデックスは、プライマリ領域およびオーバーフロー領域という2つの領域に 格納されます。インデックスが付けられたフィールドの値が同一な値 のポインタはプライマリ領域が有効な数だけ格納され、全て使用されつくされた場合、 オーバーフロー領域に格納されます。オーバーフロー領域は無期限に成長することが できます。
オーバーフローが0より大きい場合、無制限に同一値およびNULL値が許可 されることに注意してください。オーバーフローが0として指定される場合、 フィールドの同一値が格納される最大数はプライマリに設定された数になり、 NULL値は許可されません。プライマリが1で、オーバーフローが0である場合 、同一値は許可されません。すなわちUNIQUEを指定するのと同じことになり ます。
同一値の無効、NULL値の無効、同一値の最大数を許可する インデックスを作成することができます。 これらのフィールドに限界以上の同一値またはNULL値を入力しようとすると エラーメッセージを出力します。
ユニークなインデックスを作成しているフィールドに同一値を入力しようとすると 以下のメッセージを出力します。
*** User Error *** duplicate value for 'attribute_value'
説明:attribute_valueは同一値です。この時インデックスは作成 されません。
データがファイルからテーブルにロードされており、ユニークか制限された インデックスが付けられたフィールドに対して同一値が制限を越えて入力された場合、 Empressは次のエラーメッセージを出力します。
*** User Error* ** duplicate value for 'attribute name' near line ###
説明:###ファイル中の行数です。
対話型のインターフェースのINSERTあるいはUPDATE コマンドにより、制限以上の同一値を入力しようとした場合、以下のエラーメッセージ を出力します。
*** Duplicate Value *** attribute 'attribute name'
よろしいですか? ..プロンプトが再発行され同一値の変更を催促します。
テーブルに既に同一値が存在する場合、Empressインポートユーティリィティ( empimpt)は、-eオプションが指定されていない場合エラーが発生 した時点で異常終了します。ユーティリィティempimptの詳細は Empress: Database Administrator's Guide を参照してください。
index_methodが指定されない場合、省略値はBTREE です。
BTREEインデックスは以下のフィールドの場合に推奨します。
TIMESERIESインデックスは以下の場合に推奨します。
簡単な検索については、インデックスを指定することが勧められます。 インデックス名のためのシンタックスはテーブル名、属性名と同一です。
小さなテーブル。小さなテーブルについては、検索速度自体早いですので インデックスを作成する必要はありません。逆にインデックスを作成することにより、 ディスクスペースを余分に使用しインデックスを参照することで検索速度を遅くする 場合があります。
インデックスを付けてはならないフィールド例として、性別のような 男か女、または曜日のような月曜から日曜のように値が 数種類のものがあります。
バッファー制限により、インデックスは2000文字以上のタイプCHAR 属性に付けてはいけません。
DISPLAY TABLEコマンドはテーブルのインデックスを表示します。
インデックスはVIEWテーブルには作成できません。
CREATE INDEXコマンド実行中に、<Rubout>、<Delete> 、<Ctrl+C>などが押された場合、警告メッセージがターミナル上に表示され、 3秒以内に再び<Rubout>あるいは<Ctrl+C>が押されると CREATE INDEXコマンドを中断することができます。
非常に大きなテーブルにインデックスを作成するとかなり時間を必要としますので、 中断する手段が存在することは大きな利点となります。偶然に中断キーを押して しまっても3秒経過すれば処理は続行しますのでリカバリできます。
割り込みキーが押される場合、次のメッセージが表示されます。
*** Interrupt *** hit another to abort
上記メッセージ後、3秒以内に割り込みキーを押さなかった場合には、以下の メッセージを出力します。
*** Resuming ***
その後、CREATE INDEXを続行します。
インデックスが付けられたフィールドによってテーブルにアクセスする場合、 インデックスにロックを配置します。これはテーブル上のロックに関係ありません。 ロックを作成する試行数は、変数MSINDEXRETRY(初期値は5)によって制御 されます。また、再試行の間隔秒数は変数MSINDEXSLEEP(省略値は1)によって 制御されます。
SELECTの中で、インデックスをロックすることができない場合、テーブル へのアクセスはインデックスを使用せずに行なわれます。更新系のオペレーションでは 行なわれません。
必要な特権
INDEX特権
例
簡単なインデックスの作成
最も簡単なインデックス(名前なし、単一のフィールド、無制限の許可の同一値、 NULL値の許可)を、personnelテーブルのnameフォールド に作成します。
CREATE INDEX ON personnel (name);
ユニークインデックスの作成
personnelテーブルのnumberフィールドにユニークインデックス を作成し、全ての個人番号がユニークになることを保証します。
CREATE UNIQUE INDEX ON personnel (number);
同一値の最大数に制限をつけインデックスを作成
loansテーブルに制限を付加(社員1人にローン3つまで)しインデックス を作成します。インデックス名なしでプライマリは3、オーバーフロー 0とします。
CREATE (3, 0) INDEX ON loans (name);
名前付きのインデックスの作成
personnelテーブルのnameフィールドに、employeeと いう名前のインデックスを作成します。
CREATE INDEX employee ON personnel (name);
複合ユニークインデックスの作成
personnelテーブルの社員の番号と名前に対して、組み合わせでユニーク な複合インデックスをpersという名前で作成します。
CREATE UNIQUE INDEX pers ON personnel (number, name);
インデックス情報の表示
personnelテーブルが、シンプルなユニークインデックスを numberフィールドに、シンプルなユニークでないインデックスを phoneフィールドに、employeeという名前付きのシンプルな インデックスをnameフィールドに、persという名前付き のユニークな複合インデックスを、numberフィールドと nameフィールドに作成されている場合、DISPLAY TABLEコマンドを 実行すると以下のように表示されます。
DISPLAY personnel; *** Table: personnel *** Attributes: number integer name char(25,1) phone char(15,1) credit_limit dollar(6,1) Indices: UNIQUE ON (number) NORMAL (2,15) employee ON (name) NORMAL (2,15) ON (phone) UNIQUE pers ON (number, name)
DROP INDEXコマンドはインデックスを削除し、それによって使用される 記憶装置を解放します。
Syntax
DROP INDEX | |name [[ON] table]] |table SET attr {, attr} |table (attr {, attr} |
|; | | |
注意
必要な特権
INDEX特権
例
シンプルな名前のないインデックスを削除
personnelテーブルのnameフィールドに作成されている、 シンプルな名前のないインデックスを削除します。
DROP INDEX ON personnel (name);
名前付きの複合インデックスを削除
personnelテーブルの、nameフィールドとnumber フィールドに作成されたpersという名前のユニークな複合インデックスを 削除します。
DROP INDEX pers;
または
DROP INDEX ON personnel (number, name);
CREATE RANGE CHECKコマンドは、与えられたフィールド用のデータ確認 チェックを作成します。チェックは、個別の値、値の範囲、値のサイズ、パターン マッチング・テンプレートあるいはこれらの組み合わせとなります。
Syntax
CREATE RANGE [ | |CHECK |CONSTRAINT |
|] [ON] table.attr | |
|[SET] range {, range} |(range {, range}) |
|; | |
説明
range |
|
||||
boundary | 次のいずれかINCLUSIVE, INCL, EXCLUSIVE, EXCLです。 EXCLは EXCLUSIVEと、またINCLはINCLUSIVEと同義語です。 省略値はINCLUSIVEです。 | ||||
operator | 次のいずれか=, !=, <, <=, >=です。 | ||||
value | データタイプに対応した値。 | ||||
match_op | 次のいずれかLIKE, MATCH, !MATCH, SMATCH, !SMATCHです。 | ||||
pattern | WHERE句で指定するパターン。 |
注意
必要な特権
ALTER特権
例
フィールドへのシンプルな範囲制約を作成します。
personnelテーブルのnumberフィールドには、1から99までの 値しか許可しない。
CREATE RANGE CHECK ON personnel.number SET BETWEEN 1 AND 99;
DISPLAY TABLEコマンドをALLオプションを指定して実行します。
DISPLAY personnel ALL; *** Table: personnel *** Attributes: number integer Range: range '1' i '99' i name char(25,1) phone char(15,1) credit_limit dollar(6,1) Creator: joe Lock Level: RECORD Table #: 9 Records: 7 Record size: 45
特定パターンとの一致を制約します。
loansテーブルのamountフィールドを$25の倍数に制限します。
CREATE RANGE CHECK ON loans.amount SET LIKE '*00', LIKE '*25', LIKE '*50', LIKE '*75';
アスタリスクはワイルドカードです。DISPLAY TABLEコマンドでは 以下のように表示されます。
DISPLAY loans ALL; *** Table: loans *** Attributes: number integer name char(25,1) date date(1) amount dollar(6,1) Range: like '*00' like '*25' like '*50' like '*75' Creator: joe Lock Level: RECORD Table #8: Records: 12 Record size: 36
DROP RANGE CHECKコマンドはフィールドからデータ範囲チェックを削除 します。これは、フィールド上に設定されている全てにチェックを削除します。
Syntax
DROP RANGE [ | |CHECK |CONSTRAINT |
|] [ON] table.attr; | |
注意
必要な特権
ALTER特権
例
loansテーブルのamountフィールドに作成された全ての制約 を削除します。
DROP RANGE CHECK ON loans.amount;
データの挿入、削除においてCREATE REFERENTIALコマンドを使用して制約 を作成できます。参照の制約は、挿入、更新、削除の時にデータが第2のテーブル中の 条件を満たさなければ、挿入、更新、削除の処理を行なわないことを確証します。
Syntax
CREATE | |REFERENTIAL |REFER |
| [ | |
|CONSTRAINT |CHECK |
|] [name] | |
[ON] constrained | |INSERT |DELETE |
| constraining; | |
説明
name | ユーザによって指定された制約名です。 | ||
constrained | 制約されるフィールドをリストします。
|
||
constraining | 制約するフィールドをリストします。
|
注意
参照の制約を確立するために、抑制されたテーブル中の1つ以上のフィールドは、 抑制するテーブル中の、1つ以上のフィールドに関係しています。
以下の条件を参照の制約が作成されるために満たさなければなりません。
制約の挿入は、抑制されるテーブルに挿入されるデータについては、抑制される フィールドの値が抑制するテーブルの対応するフィールドの少なくとも1つのレコード と等しいに違いないことを暗示します。
制約の削除は、抑制されるテーブルから削除されるデータについては、抑制される フィールドの値が抑制するテーブルの対応するフィールドの任意のレコードであり 等しくあってはならないことを暗示します。
UPDATEステートメントはINSERTの後にDELETEが行な われると見なすことができます。参考の制約はこのように評価されます。
必要な特権
制約されるテーブルにはALTER特権を、制約するテーブルには SELECT特権が必要です。
例
挿入制約の作成
従業員でない人からローンを組まれないように、挿入制約をloans.nameの 上で作成し、下記コマンドでpersonnel.nameによって抑制します。
CREATE REFER no_loan ON loans (name) INSERT personnel (name);
作成された制約を参照します。
DISPLAY loans; *** Table: loans *** Attributes: number integer name char(25,1) date date(1) amount dollar(6,1) Referential: no_loan (name) INSERT personnel (name)
制約されているか、loansテーブルにpersonnelテーブルの nameフィールドに存在しない名前を挿入してみます。
INSERT INTO loans (name) VALUES ("Doe"); *** User Error *** insert constraint 'no_loan' violation
削除制約の作成
ローンが残っている従業員を、personnelテーブルからの削除を防ぐため に、次の制約を作成します。
CREATE REFER still_owes ON personnel (name) DELETE loans (name);
作成された制約を参照します。
DISPLAY personnel; *** Table: personnel *** Attributes: number integer name char(25,1) phone char(15,1) credit_limit dollar(6,1) Referential: still_owes (name) DELETE loans (name)
制約されているか、loansテーブルに存在している名前を、 personnelテーブルから削除してみます。
DELETE FROM personnel WHERE name = "Mosca"; *** delete constraint 'still_owes' violation
複雑な挿入制約
personnelテーブルの、nameフィールドとnumber フィールドによって、loansテーブルのnameフィールドと numberフィールドに挿入制約を作成します。
CREATE REFER name_number ON loans (name, number) INSERT personnel (name, number);
作成された制約を参照します。
DISPLAY loans; *** Table: loans *** Attributes: number integer name char(25,1) date date(1) amount dollar(6,1) Referential: name_number (name, number) INSERT personnel (name, number)
loansテーブルへ挿入してみます。
INSERT INTO loans (name, number) values ('Mosca' 5);
両方の制約が満たされます。オペレーションが実行されます。
loansテーブルに以下のコマンドを実行した場合。
INSERT INTO loans (name, number) VALUES ('Mosca', 10);
エラーメッセージを表示します。
*** User Error *** insert constraint 'name_number' violation
制約は満たされません。
複数制約の作成
personnelテーブルのnameフィールドによって、loans テーブルのnameフィールドに挿入制約を作成します。
CREATE REFER name ON loans (name) INSERT personnel (name);
personnelテーブルのnumberフィールドによって、loans テーブルのnumberフィールドに挿入制約を作成します。
CREATE REFER number ON loans (number) INSERT personnel (number);
作成した制約を参照します。
DISPLAY loans; *** Table: loans *** Attributes: number integer name char(25,1) date date(1) amount dollar(6,1) Referential: name (name) INSERT personnel (name) number (number) INSERT personnel (number)
loansテーブルのnameフィールドにMoscaを、 numberフィールドに5 (Moscaの個人番号) を入力します。
INSERT loans SET name = 'Mosca', number = 5;
両方の制約が満たされます。personnelテーブルのname フィールドとnumberフィールドにレコードを挿入する事は実行されます。
loansテーブルのnameフィールドにMoscaを、 numberフィールドに10 (Jonesの個人番号を挿入します。
INSERT loans SET name = 'Mosca', number = 10;
両方の制約が満たされます。nameフィールド値がMoscaを引き受ける personnelテーブルおよび、numberフィールド値に10が存在する ため、オペレーションが実行されます。両方の制約は満たされますがそれらが同じ レコードによって満たされないことに注意してください。
コマンドで、numberフィールドに1(未使用の個人番号)に対するMoscaの値 を備えたloansテーブルにレコードを挿入してください。
INSERT loans SET name = 'Mosca', number = 1;
以下の出力を行います。
*** User Error *** insert constraint 'number' violation
名制約がレコードによって、nameフィールドのための値Moscaに満足で ある一方、numberフィールドに対する1の値で制約を満たすレコードはあり ません。
DROP REFERENTIALコマンドによって参照制約を削除できます。
Syntax
DROP | |REFERENTIAL |REFER |
| [ | |
|CONSTRAINT |CHECK |
|] [name] | |
[[ON] constrained | |INSERT |DELETE |
| constraining]; | |
説明
name | ユーザによって指定された制約名。 | ||
constrained | 制約されるフィールド名をリストします。
|
||
constraining | 制約するフィールド名をリストします。
|
注意
上記のシンタックスの場合において、指定された制約名がユニークでない場合、 Empressは抑制されるテーブル名での応答があります。yまたは nを返答してください。制約を削除したいテーブル名であったらyを、 削除したくないテーブルの場合はnを返答してください。
必要な特権
ALTER特権
例
loansテーブルのno_loansという名前の制約を削除します。
DROP REFER no_loans;
CREATE VIEWコマンドは1つ以上のテーブル上で論理的な テーブル(VIEW)を確立します。VIEWの構造はSELECTコマンドによって定義 されます。そしてVIEWによりもとのテーブルにアクセスできます。 VIEWの構造はデータディクショナリーに格納されます。
Syntax
CREATE VIEW view [(attr { , attr})] AS select_command;
説明
view | VIEWテーブル名。 |
select_command | SELECT文。SELECTコマンド を参照してください。 |
注意
テーブルが削除される場合、VIEWが存在することの警告は与えられません。
VIEWに使用できないコマンドは次のとおりです。ALTER, CREATE INDEX, DROP INDEX, EMPTY, LOCK LEVEL, SORT.
以下に、EmpressがVIEWに対する更新系の操作を許可する条件を示します。
この条件は3つの規則で表現することができます。
次のものは除外します。
VIEW上で許可される更新系操作のための第2の条件は、ジョインするための フィールド間の同等条件のグループごとに各1つだけのフィールドがVIEWに選択されて いることです。この条件で更新した場合には、VIEWの更新により各基本テーブルの 各フィールドがそれぞれ更新されます。
第2の条件は、等しい基本テーブル中のフィールドのすべてのセットについては、 1つだけがVIEWに選択されます。VIEWが更新される場合、そのようなセット中のすべて のフィールドは、同じ値で更新されます。
第3の条件はNOT NULLを指定したフィールドかユニークなインデックスを 持ったフィールドと関係しているということです。
必要な特権
sys_tablesに対するINSERT特権と基本テーブルの作成者。
例
personnelテーブルのnameフィールドとphone フィールドを使用して、employeesというシンプルなVIEWを作成します。
CREATE VIEW employees AS SELECT name, phone FROM personnel;
以下のコマンドを実行します。
SELECT * FROM employees;
このように表示されます。
name phone Kilroy 426-9681 Mosca 544-2243 Wladislaw 723-6073 Jones 667-2951 Peterson 978-6060 Scarlatti 961-7363 Jordan 964-3335
DISPLAY TABLEコマンドでVIEWの構造を表示できます。
DISPLAY employees; *** View: employees *** Attributes: name char(25,1) phone char(15,1)
DISPLAY TABLEコマンドにALLオプションを指定すると、VIEWを 作成したSELECTコマンドを参照できます。
DISPLAY employees ALL; *** View: employees *** View: select attr 'name', attr 'phone' from 'personnel' Attributes: name char(25,1) phone char(15,1) Creator: joe Table #: 11 Records: 7
複雑なVIEWの作成
VIEWを作ることが便利である理由は、2つ以上のテーブルからジョインする場合に、 VIEWを一度作成してしまえば毎回SELECTコマンドでジョインンする必要が なくなるからです。例えば、Jonesのローンおよび信用限度を示すためにloans テーブルとpersonnelテーブルからjonesloansという名前のVIEWを 作成するには、以下のコマンドを実行します。
CREATE VIEW jonesloans AS SELECT name, date, amount, credit_limit FROM loans, personnel WHERE loans.name = 'Jones' AND loans.name = personnel.name;
DROP VIEWコマンドはデータディクショナリーからVIEWを削除します。
Syntax
DROP [VIEW] view;
where:
view | VIEWテーブル名。 |
注意
VIEWの削除では警告メッセージは表示されません。
必要な特権
DROP特権
例
jonesloansというVIEWを削除します。
DROP VIEW jonesloans;
CREATE COMMENTコマンドはテーブル、フィールド、モジュール、ルーチン あるいはトリガにコメントを作成します。コメントは、DISPLAY DATABASEか DISPLAY TABLEコマンドで表示できます。
Syntax
Syntax 1:
CREATE COMMENT [ON] | |TABLE |ATTR[IBUTE] |MODULE |ROUTINE |TRIGGER |
table table.attr module module.routine trigger |
| [SET] comment_string; | | | | |
Syntax 2:
COMMENT [ON] | |TABLE |ATTR[IBUTE] |MODULE |ROUTINE |TRIGGER |
table table.attr module module.routine trigger |
| [IS] comment_string; | | | | |
説明
module | パーシスタントストアドモジュール名。 |
routine | ルーチン名。モジュール名を先行させ指定します。Empressキーワード として扱われるため、引用符で囲む必要があります。 |
trigger | トリガ名。 |
comment_string | 引用符で囲まれた文字列。 |
注意
フィールドにコメントを作成する場合は、テーブル名を指定しなければいけま せん。
CREATE COMMENTはVIEWにも使用できます。
モジュール内の同じ名前を持ったルーチンは、外部名が違う場合でも共通の コメントを共有します。
必要な特権
ALTER特権
例
テーブルにコメントを作成します。
loansテーブルにコメントを作成します。
COMMENT ON TABLE loans IS "Loans to Employees";
DISPLAY TABLEコマンドでコメントが表示されます。
DISPLAY loans; *** Table: loans *** Comment: Loans to Employees Attributes: number integer name char(25,1) date date(1) amount dollar(6,1)
フィールドにコメントを作成します。
loansテーブルのamountフィールドにコメントを作成します。
CREATE COMMENT ON ATTRIBUTE loans.amount SET 'Amounts must be multiples of $$25';
2つのドル($)記号は、Empress変数の解釈を回避させるのに必要です。詳細は Variables and Stringsの Empress Conventionsを参照してください。
DISPLAY TABLEコマンドにALLオプションを指定すると コメントが表示されます。
DISPLAY loans ALL; *** Table: loans *** Comment: Loans to Employees Attributes: number integer name char(25,1) date date(1) amount dollar(6,1) Comment: Amounts must be multiples of $25 Creator: joe Lock Level: RECORD Table #: 8 Records: 12 Record size: 36
特定のフィールドに関するコメントは、フィールドを指定した DISPLAY TABLEで表示することができます。
DISPLAY loans ON amount ALL; *** Table: loans *** Comment: Loans to Employees Attributes: amount dollar(6,1) Comment: Amounts must be multiples of $25 Creator: joe Lock Level: RECORD Table #: 8 Records: 12 Record size: 36
DROP COMMENTコマンドはテーブルまたはフィールドからコメントを削除 します。
Syntax
DROP COMMENT [ON] | |TABLE |ATTR[IBUTE] |MODULE |ROUTINE |TRIGGER |
table table.attr module module.routine trigger |
|; | | | | |
注意
DROP COMMENTコマンドは同様にVIEWのコメントも削除できます。
必要な特権
ALTER特権
例
loansテーブルからコメントを削除します。
DROP COMMENT ON TABLE loans;
GRANT PRIVILEGEコマンドは、テーブルのアクセス特権をユーザに 与えます。特権を与えられたユーザもまた他のユーザに特権を与えることも可能です。 特権の削除はREMOVE PRIVILEGEコマンドで、表示は DISPLAY PRIVILEGEコマンドとDISPLAY GRANT PRIVILEGEコマンドで 行なえます。
Syntax
GRANT privilege {, privilege} [ON] table [TO] grantee {, grantee} [AS grantor] [[WITH] GRANT [OPTION]];
説明
privilege | Table 4-3にリストされたいずれか1つ。 | |||
grantee |
特権を付与されるユーザ名。CREATORはテーブル作成者。 DBA はデータベース管理者。PUBLICは全てのユーザ。username はシステムのログイン名またはアカウント名です。 |
|||
grantor |
特権を付与するユーザ名。grantorを指定しない場合、 省略値はコマンドを発行したユーザ名となります。 |
注意
Table 4-3: データベース特権
特権 | 許可されるコマンド |
ALTER | ALTER TABLE, CREATE/DROP COMMENT, CREATE/DROP RANGE CHECK, CREATE/DROP REFERENTIAL CONSTRAINT, LOCK LEVEL, RENAME |
BYPASS_LOCK | SELECT BYPASS_LOCK |
DELETE | DELETE, SELECT |
DISPLAY | DISPLAY TABLE |
DROP | DROP TABLE |
EMPTY | EMPTY TABLE |
INDEX | CREATE/DROP INDEX |
INSERT | INSERT |
SELECT | SELECT |
SORT | SORT |
UPDATE [(attr {, attr})] | UPDATE, SELECT フィールドが指定された場合、特権は 指定フィールドのみ有効となります。 |
いくつかの特権を集めたグループ名で指定できます。グループ名には DBA(管理者)、ALL、USERがあります。
Table 4-4: データベース特権グループ
特権タイプ | 特権 |
DBA | ALTER, DROP, EMPTY, INDEX, SORT |
ALL | All privileges. |
USER | BYPASS_LOCK, DELETE, DISPLAY, INSERT, SELECT, UPDATE |
DBAは変数 MSDBADMINISTRATORによってtabzeroに定義されます。 テーブルのCREATORはデータ・ディクショナリー中の sys_tablesに定義されます。
データベースのDBAおよびテーブルのCREATORは、適切な システムデータの更新により変更されます。DBAおよびCREATORの 特権を与えることは、それらがDBAかCREATORになるとともにユーザ によって特権を継承する手段を提供します。
Empressは、各データベースが作成されているオペレーティングシステムによって セットされるファイル許可を使用します。Empressデータベース中のテーブルに アクセスするために、ユーザは適切なオペレーティング システムファイル許可および 適切なデータベース特権の両方を持っていなければなりません。 例えばUNIXでは、DBAは付与する特権に適合したファイル許可を他ユーザに 与えなくてはなりません。 ユーザがデータベース上で検索だけするのであれば、データベースのディレクトリに あるテーブルに対応するファイルについては読み取り許可があれば十分です。 ユーザがデータベースで更新系の操作をするのであればテーブルおよび システムテーブルに対応したファイルについて書き込み許可を与えられなければ なりません。これはchmodコマンドの使用により行うことができます。 (使用法はUNIXマニュアルを参照)。 ユーザがデータベース上の新しいテーブルを作成する必要があれば、データベースを 含んでいるディレクトリについての書き込み許可がユーザに与えられなくてはなりま せん。
Table 4-5: DBAの特権初期値
Grantor | Grantee | Privilege | Grant Option |
DBA | DBA | DBA 特権: ALTER, DROP EMPTY, INDEX, SORT | GRANTオプションなし。 |
DBA | DBA | USER 特権: BYPASS_LOCK, DELETE, DISPLAY, CREATOR, INSERT, SELECT, UPDATE | GRANTオプション付き。 |
Table 4-6: CREATORの特権初期値
Grantor | Grantee | Privilege | Grant Option |
CREATOR | CREATOR | DBA 特権: ALTER, DROP EMPTY, INDEX, SORT | grantオプションはなし。 |
CREATOR | username (作成者のログイン名) | USER 特権: BYPASS_LOCK, DELETE, DISPLAY, CREATOR, INSERT, SELECT, UPDATE | GRANTオプション付き。 |
必要な特権
譲渡者は付与したい特権のgrant権限が必要です。
例
特定ユーザへの特権付与
auto partsテーブル上のSELECT特権とINSERT特権を ユーザmoscaとkilroyに付与します。
GRANT SELECT, INSERT ON 'auto parts' TO mosca, kilroy;
特権を付与オプションを付けて付与
ユーザofficeにcustomersテーブルのINSERT特権、 UPDATE特権、DELETE特権を作成者と同等に付与オプション を付けて付与します。
GRANT INSERT, UPDATE, DELETE ON customers TO office AS CREATOR WITH GRANT OPTION;
全ユーザに対して特権を付与
customersテーブルのSELECT特権を全ユーザの作成者と同等に 付与します。
GRANT SELECT ON customers TO PUBLIC AS CREATOR;
DISPLAY PRIVILEGEコマンドは指定されたテーブルのアクセス特権を表示 します。
Syntax
DISPLAY | |PRIVILEGE |PRIV |
| table [ON [ATTR] | |
|attr |[NOT] match_op pattern |
|] | |
[ | |ALL |AS | | |
|DBA |CREATOR |username |
| | | |
|]; | | | |
説明
match_op | 次のいずれか1つLIKE, MATCH, !MATCH, SMATCH, !SMATCH。 |
pattern | WHERE句で指定するパターン。引用符で囲む必要があります。 |
username | システムのログイン名またはアカウント名。 |
注意
必要な特権
なし
例
テーブルの特権を表示します。
loansテーブルの自分の特権を表示します。
DISPLAY PRIVILEGE loans;
以下を表示します。
ALL
特権の分類を表示します。
特権の分類を含めて表示します。
DISPLAY PRIVILEGE loans ALL;
以下を表示します。
USER: delete display insert select update CREATOR: alter drop empty index sort
DISPLAY GRANT PRIVILEGEコマンドは、指定されたテーブルの付与できる 特権の情報を表示します。
Syntax
DISPLAY GRANT | |PRIVILEGE |PRIV |
| table [ON [ATTR] | |
|attr |[NOT] match_op pattern |
|] | |
[ | |ALL |AS | | |
|DBA |CREATOR |username |
| | | |
|]; | | | |
説明
match_op | 次のいずれか1つLIKE, MATCH, !MATCH, SMATCH, !SMATCH。 |
pattern | WHERE句で指定するパターン。引用符で囲む必要があります。 |
username | システムのログイン名またはアカウント名。 |
注意
必要な特権
なし
例
付与できる特権を表示します。
loansテーブルに対する付与できる特権を表示します。
DISPLAY GRANT PRIVILEGE loans;
以下を表示します。
USER: delete display insert select update
付与できる特権を詳細に表示します。
付与できる特権の詳細を表示します。
DISPLAY GRANT PRIVILEGE loans ALL;
以下を表示します。
USER: delete display insert select update CREATOR: all DBA: all
REVOKE PRIVILEGEコマンドはテーブルからユーザの特権を削除します。
Syntax
REVOKE privilege {, privilege} [ON] table [FROM] grantee {, grantee} [AS grantor];
説明
privilege | TABLE 4-3にリストされたいずれか1つ。 | |||
grantee |
特権を付与されたユーザ名。CREATORはテーブル作成者。DBAは デーベース管理者。PUBLICは全てのユーザ。usernameは システムのログイン名またはアカウント名。 |
|||
grantor |
特権を付与するユーザ。grantorが指定されない場合、 省略値はコマンドの発行者となります。 |
注意
必要な特権
削除する特権の付与者でなくてはなりません。
例
auto partsテーブル上のユーザmoscaが持つINSERT 特権を削除します。
REVOKE INSERT ON 'auto parts' FROM mosca;
LOCK LEVELコマンドは、テーブルのロックレベルを設定します。次に LOCK LEVELコマンドを発行するまでその設定は全ユーザに有効となります。
ロックレベルの設定は、マルチユーザシステムでデータベースを扱う場合の アクセス制御をすることを目的にしています。
Syntax
LOCK LEVEL [ON] table [IS] | |TABLE |GROUP [(n)] |RECORD [(n)] |NULL |
|; | | | |
注意
SQLコマンドの中で使用されたフィールドにインデックスが無ければ、グループの ロックレベルはテーブルのロックレベルと同一になります。
必要な特権
ロックするテーブルにALTER特権が必要です。
例
テーブルのロックを無効にします。
personnelテーブルのロックレベルをNULLにします。
LOCK LEVEL ON personnel IS NULL;
テーブルにレコードレベルのロックを設定します。
loansテーブルをレコードレベルのロックに設定します。
LOCK LEVEL ON loans IS RECORD;
The CREATE MODULEコマンドはデータ・ディクショナリーへPSM (Parsistant Stored Module)モジュールの定義を格納するために使用されます。 これは、ユーザに定義された機能、オペレーター、手続きあるいは総計機能のための エントリーポイントを作成します。UPDATE MODULEコマンドは、モジュール 定義をモジュールロード可能なシェアードライブラリとリンクするために必要です。
Syntax
CREATE MODULE module_name [LANGUAGE C [(lang_param {, lang_param})]]
|module_procedure |module_function |module_operator |module_agg_func |
|; { | | | |
|module_procedure |module_function |module_operator |module_agg_func |
|;} | | | |
END MODULE;
説明
module_name | モジュール名。 | ||||
lang_param | 現在、Empressで使用していません。 | module_procedure | 以下の定義を行ないます。
[DECLARE] PROCEDURE procedure_name ([[| IN |] [parameter_name] parameter_type | OUT | |INOUT| {, [| IN |] [parameter_name] parameter_type}]) | OUT | |INOUT| [ALLOCATE WORKSPACE | nbytes |] | variable | EXTERNAL [BEGIN EXPRESSION external_routine_name] [NAME external_routine_name] [END EXPRESSION external_routine_name] [|PARAMETER STYLE SQL |] |PARAMETER STYLE GENERAL| |
||
module_function | 以下の定義を行ないます。
[DECLARE] FUNCTION function_name ([[IN] [parameter_name] parameter_type {, [IN] [parameter_name] parameter_type}]) RETURNS return_type [ALLOCATE WORKSPACE | nbytes |] | variable | EXTERNAL [BEGIN EXPRESSION external_routine_name] [NAME external_routine_name] [END EXPRESSION external_routine_name] [|PARAMETER STYLE SQL |] |PARAMETER STYLE GENERAL| | ||||
module_operator | 以下の定義を行ないます。
([[IN] [parameter_name] parameter_type {, [IN] [parameter_name] parameter_type}]) RETURNS return_type [ALLOCATE WORKSPACE | nbytes |] | variable | EXTERNAL [BEGIN EXPRESSION external_routine_name] [NAME external_routine_name] [END EXPRESSION external_routine_name] [|PARAMETER STYLE SQL |] |PARAMETER STYLE GENERAL| | ||||
module_agg_func | 以下の定義を行ないます。
[DECLARE] AGGREGATE FUNCTION aggr_function_name ([IN] parameter_name] parameter_type {, [IN] [parameter_name] parameter_type}) RETURNS return_type [ALLOCATE WORKSPACE | nbytes |] |variable| EXTERNAL [BEGIN EXPRESSION external_routine_name] BEGIN GROUP external_routine_name BODY external_routine_name END GROUP external_routine_name [END EXPRESSION external_routine_name] [|PARAMETER STYLE SQL |] |PARAMETER STYLE GENERAL| |
注意
EmpressのPSMには、現在Cプログラミング言語だけがサポートされて います。今後、他の言語がサポートされるかもしれません。
Cプログラミングでの記述は大文字、小文字両方とも可能です。
パラメータモードとしてIN、OUT、INOUTがあり それぞれ入力、出力、入出力となります。省略値はINです。
parameter_typeには3種類のグループがあります。
MSデータタイプ | Empress SQLデータタイプです。 データタイプを参照してください。 |
汎用データタイプ | Empress汎用データタイプです。Empress: ユーザ定義関数 のData Type Correspondences を参照してください。 |
Cデータタイプ | Cプログラミング言語のデータタイプです。 データタイプの前に、キーワードCを付け、引用符で囲まなくてはなりま せん。"C long" |
パラメータは違うグループの混在も許可します。
(number "C long", string CHAR, amount GENERIC FLOAT)
return_typeは、parameter_typeのように 異なるグループを持つ可能性があります。
以下に示す5つのオペレータークラスがあります。
INFIXオペレータークラスのprecedenceは、1, 2,3,4,5,6, right。 booleanオペレターは、1,2のみ有効、省略値は2です。 数学オペレーターは、すべて、省略値は4です。
パラメータスタイルは、PARAMETER STYLE GENERALまたは PARAMETER STYLE SQLです。省略値はPARAMETER STYLE GENERALです。
下記に、手続き、機能、オペレーターおよび統計機能に説明します。
名前のルール
モジュール名、ルーチン名および外部名の前方または後方のブランクは無視され ます。先頭はアンダースコア(_)または、英字で始まり、アンダースコアまたは英数字 で構成され、最大31文字以内で構成されなくてはなりません。
external_routine_nameは5つに分類されます。
集計関数は5つ全てのクラスが存在しますが、他のルーチンではbegin groupと end groupは存在しません。
外部BODYルーチン名は、統計機能と他のルーチン用の外部名節のために、 (NAME)とBODY節(BODY)によって指定されます。 省略時の外部BODY名はルーチン名と同じです。
External begin groupとend groupルーチン名は、統計関数のために指定されます。 一般的にbegin group expressionルーチン名はリターン値のために、初期化と end groupルーチンで使用されます。
ALLOCATE WORKSPACEが指定された場合、Empressは自動的に PSMのために作業用スペースの確保と開放を行ないます。
変数名がworkspaceに対して与えられる場合、外部ルーチンの中で同一の変数名を 定義しなくてはなりません。
詳細は、ユーザ定義関数マニュアルの Persistent Stored Modules (PSM)を参照してください。
必要な特権
DBA特権
例
次の例はモジュール手続きprocmoduleを作成します。 例の手続きlog_eventはaudit trail logを作成するために使用されます。
CREATE MODULE procmodule PROCEDURE log_event () EXTERNAL; END MODULE;
次の例はモジュール関数funcmoduleを作成します。このモジュール 機能は2つの機能replacenullとroundupを宣言します。
例の関数replacenullは、NULL値を指定された文字列に変換 します。関数roundupは、指定された10進数字を四捨五入します。
CREATE MODULE funcmodule FUNCTION replacenull (stringvalue CHAR, defaultstring CHAR) RETURNS CHAR EXTERNAL; FUNCTION roundup (number GENERIC FLOAT, digits GENERIC FLOAT) RETURNS GENERIC FLOAT EXTERNAL; END MODULE;
replacenullとroundup関数がEmpressの組込み関数 nullvalとroundと同じものであることに注意してください。 nullvalおよびroundは、この例の中で使用することができない Empressキーワードです。
次の例はモジュール・オペレーターopermoduleを作成します。 例のオペレーターconcatenationは文字データを連結します。この オペレーターはEmpressオペレーターconcatと同じものです。
CREATE MODULE opermodule OPERATOR INFIX concatenation (str1 "C char", str2 "C char") RETURNS "C char" EXTERNAL; END MODULE;
次の例はモジュール集計関数aggrmoduleを作成します。 例の集計関数ssdは、集計のxデータの2乗された標準偏差に関連した最終の 総計の値を算出します。
CREATE MODULE aggrmodule AGGREGATE FUNCTION ssd (LONGFLOAT) RETURNS LONGFLOAT ALLOCATE WORKSPACE somespace EXTERNAL BEGIN GROUP ssdigrp BODY ssdrfns END GROUP ssdtgrp; END MODULE;
例中の外部ルーチンは、EMPRESS: ユーザ定義関数を参照してください。
UPDATE MODULEコマンドはモジュール定義をモジュールロード可能な シェアードライブラリとリンクします。
Syntax
UPDATE MODULE module_name [FOR system_name] [|FROM | dll_file]; |USING| |
説明
module_name | モジュール名。 |
system_name | Empress RDBMSライセンスで有効なシステムID。 | dll_file | 動的にロード可能なシェアードライブラリオブジェクトファイル名。 |
注意
PSMルーチンのインプリメンテーションを備えたモジュールを更新するために、 UPDATE MODULEコマンドは、FROM dll_fileか USING dll_fileオプションと共に通常使用されます。
モジュールが、古いバージョン(例えばバージョン8.20)からより新しい バージョン(例えばバージョン8.62)に変換される場合、その古いwrap.dllは 新バージョン上で実行することができません。 データベースがより新しいバージョンに改良される場合のみ、FROM dll_file かUSING dll_fileオプションのないUPDATE MODULEコマンドを使用 してください。 この場合、与えられたモジュール用のwrap.dllファイルを再生成します。
モジュールが動的なロード可能なシェアードライブラリオブジェクトファイル の内容かパスが変更された場合、UPDATE MODULEコマンドを使用することが できます。
system_nameは以下のコマンドで取得できます。
empvers
上記コマンドはシステムプロンプトで実行し、以下のような表示がされます。
EMPRESS V8.62 (c) Copyright Empress Software Inc. 1983, 2002 for Intel x86 running Linux OS Release 2.0 with libc.so.6 (ELF) [linux-libc6-x86] Port Code DOCS-08.62-A-00-S-ENG Port Code DOSV-08.62-A-00-S-ENG Port Code HYPM-08.62-A-00-S-ENG Port Code JDBC-08.62-A-00-S-ENG Port Code ODBC-08.62-A-00-S-ENG Port Code RDBM-08.62-A-00-S-ENG Installed in: /home/staff/joe/empress/v8.62
システム名は、鍵括弧で囲まれた中に示されます。linux-libc6-x86
必要な特権
DBA特権
例
下記コマンドは、動的なロード可能なシェアードライブラリオブジェクトファイル procmodule.dllからのモジュールprocmoduleを更新します。
UPDATE MODULE procmodule FROM 'procmodule.dll';
DROP MODULEコマンドはデータベースデータディクショナリーから モジュール定義を削除します。モジュールに定義されるどんな機能、手続き、 オペレーターおよび総計機能も使用できなくなります。
Syntax
DROP MODULE module_name;
説明
module_name | モジュール名。 |
注意
モジュール削除には警告メッセージは表示されません。
必要な特権
DBA特権
例
下記は、procmoduleという名前のモジュールを削除します。
DROP MODULE procmodule;
DISPLAY MODULEコマンドは、データベースデータディクショナリーからの モジュール定義を表示します。
Syntax
DISPLAY MODULE [module_name] [ALL] [DUMP] [ | |INTO |ONTO |
| file]; | |
説明
module_name | モジュール名。 |
注意
ALLオプションのないDISPLAY MODULEコマンドは、 このモジュールが利用可能なシステム、モジュール中のすべてのSQLで起動する ルーチンおよびそれらの外部名前を表示します。
モジュールがどのシステムにも有効でない場合(NONE表示)は、作成されたが リンクされていない(UPDATE MODULEコマンドで)ことを意味します。
DISPLAY MODULEコマンドにALLオプションを指定すると、 次のモジュールについての補足情報を提供します。パラメーター情報、 リターンデータタイプ、パラメータースタイル、モジュールの作成者、 モジュール番号、モジュールを作成したプログラミング言語(現在はCプログラミング 言語のみです)。
DUMPが指定された場合、出力は圧縮され、スクリプトファイルを 作成するために使用することができます。
INTO fileまたはONTO fileが指定された 場合、出力はターミナルへではなく指定されたファイルへ送られます。 ONTOは追記しますがINTOはファイルに上書きします。 またどちらもファイルが存在しない場合はファイルを作成します。
必要な特権
DISPLAY特権
例
以下に表示の違うDISPLAY MODULEコマンドを示します。
* DISPLAY MODULE; aggrmodule funcmodule opermodule procmodule * DISPLAY MODULE funcmodule; **** Database: repairs **** *** Module: funcmodule *** Available for systems: NONE replacenull function External Name: replacenull roundup function External Name: roundup * DISPLAY MODULE ALL; **** Database: repairs **** *** Module: aggrmodule *** Available for systems: NONE ssd aggregate function *** Module: funcmodule *** Available for systems: NONE replacenull function roundup function *** Module: opermodule *** Available for systems: NONE fact postfix operator *** Module: procmodule *** Available for systems: NONE log_event procedure * DISPLAY MODULE funcmodule ALL; *** Module: funcmodule *** Available for systems: NONE replacenull function Number of Parameters: 2 1) in stringvalue character(25,1) 2) in defaultstring character(25,1) Return Data Type: character(25,1) Parameter Style: general External Name: replacenull roundup function Number of Parameters: 2 1) in number generic float 2) in digits generic float Return Data Type: generic float Parameter Style: general External Name: roundup Creator: zsu Module #: 2 Language: C * DISPLAY MODULE DUMP; aggrmodule funcmodule opermodule procmodule
CREATE TRIGGERコマンドはデータベースデータディクショナリーへ トリガ定義を作成します。
Syntax
CREATE TRIGGER trigger_name | |BEFORE |AFTER |
| | |
|DELETE |INSERT |UPDATE [ OF (attr {, attr})] |SELECT [ OF (attr {, attr})] |
| {, | | | |
|DELETE |INSERT |UPDATE [ OF (attr {, attr})] |SELECT [ OF (attr {, attr})] |
| } | | | |
ON table [FOR EACH ROW [when_clause]] EXECUTE procedure_name;
説明
trigger_name | トリガ名。トリガの命名規約はテーブル名、フィールド名と同様です。 | ||||||
when_clause | 以下のシンタックスです。
b_exprはブール式です。ブール式の詳細はWHERE句を参照してください。
| ||||||
procedure_name | PSM (パーシスタントストアドモジュール)のプロシージャ名です。 |
注意
トリガを作成する時に指定するprocedure_nameは、CREATE MODULEコマンドで定義されていない場合にはエラーメッセージを表示します。
トリガを使用する前には、UPDATE MODULEを発行する必要があります。 発行しないとprocedure_nameが存在しない旨のエラーメッセージを表示 します。
トリガのためのprocedureはパラメーターのないPSMプロシージャ です。パラメーターを備えたモジュールprocedureがCREATE TRIGGER コマンドと共に使用されると、エラーメッセージを表示します。
FOR EACH ROWオプションなしで作成されるトリガはステート メントトリガと呼ばれます。SQLコマンドが実行され、オペレーションが複数の レコードに適用される場合でも、それはファンクションを起動します。
FOR EACH ROWオプションで作成されるトリガは列トリガと 呼ばれます。オペレーションがデータのレコードに適用されるごとに、それは ファンクションを起動します。
トリガはステートメント/オペレーション(INSERT、DELETE、 UPDATE)が列/レコードの上で試みられる前、あるいはオペレーションが完了 した後に、明示することができます。 SELECTトリガの場合には、SELECT操作が完了した後だけに、 明示することができます。
UPDATEおよびSELECTトリガは対応する複数のフィールドを指定する ことができます。フィールドが指定されない場合、テーブル内の全てのフィールドが 対象となります。
when_clauseはFOR EACH ROWオプションに関係しています。 FOR EACH ROWがCREATE TRIGGERコマンドの中で指定されていない 場合、when_clauseは割り当てることができません。 一旦アクセスされたレコードがwhere_clauseの条件を満たす場合、 FOR EACH ROWオプションのために割り当てられたトリガが有効となります。
when_clauseの指定はWHERE句の指定と似ています。サブクエリーは サポートされていません。
when_clauseの中でフィールド値を使用する場合。
updateトリガを使用する場合。
テーブル名およびフィールド名(RENAMEコマンドによる)の変更は既存 のトリガに効果がありません。トリガは、新しい名前のもとで正確に自動的に機能 します。
フィールドの変更(ALTER TABLEコマンドによる)より、テーブルを 変更してもトリガに効果がありません。トリガは、新しいテーブル構造のもとで正確に 自動的に機能します。フィールドが削除された場合、設定されたトリガはすべて削除 されます。
トリガはVIEWに対しても有効です。
トリガは、ALTER TABLEコマンドの使用により一時的に無効にしたり 有効にしたりできます。トリガの作成時は自動的に有効となります。
多数のトリガが同じ出来事のために作成される場合、トリガ定義内の優先度は 実行されるトリガ手続きの順序を決定します。トリガが作成される場合、優先度は 0.000にセットされます。トリガの優先度を変更する場合はALTER TABLE コマンドを使用します。
トリガ定義はDISPLAY TABLE table_name ALLコマンドによって表示 できます。
必要な特権
ALTER特権
例
loansテーブルが更新される場合のトリガ、history_logを 作成します。手続きlog_eventは更新を記録するために実行されます。
最初のステップはユーザに定義された手続きを作成することです。この例における 手続きは以下に示すuser.c内にあります。
#include <usrfns.h> #include <time.h> static void print_rec (void* mr, void* rec, char* tag) { extern char* mrganame (addr); void* attr; int i; char* val; for (i = 1; ; ++i) { attr = mrigeta (mr, i); if (attr == 0) break; val = mrgetvs (rec, attr); if (val == 0) val = "(NULL)"; printf ("\t%s %s = '%s'\n", tag, mrganame (attr), val); } } static void trigger_proc (char* procname) { extern char* mrgname (); extern int strcmp (); time_t t; void* mr; void* newrec; void* oldrec; char* s; mspsm_trig_get_record_info (& mr, & oldrec, & newrec); printf ("+++ Trigger Procedure +++ %s for table '%s'\n", procname, mrgname (mr)); time (& t); printf ("\ttime: %s", ctime (& t)); if (oldrec == 0) printf ("\tNo Old Record\n"); else print_rec (mr, oldrec, "Old"); if (newrec == 0) printf ("\tNo New Record\n"); else print_rec (mr, newrec, "New"); } void log_ins_upd_del () { trigger_proc ("log_ins_upd_del"); }
emppsmccコマンドでソースファイルuser.cをコンパイルして、共有される オブジェクトファイルuser.dllを作成します。
emppsmcc -o user.dll user.c
次のステップはモジュールおよびトリガを定義します。そして共有される オブジェクトファイルuser.dllをモジュール定義にリンクします。
CREATE MODULE for_trigger PROCEDURE log_event ( ) EXTERNAL NAME log_ins_upd_del; END MODULE; CREATE TRIGGER history_log BEFORE INSERT OR DELETE OR UPDATE ON loans FOR EACH ROW EXECUTE log_event; UPDATE MODULE for_trigger FROM 'user.dll';
表示コマンドを実行します。
DISPLAY TABLE loans ALL;
以下の表示をします。
*** Table: loans *** Attributes: number integer name char(25,1) date date(1) amount dollar(6,1) Triggers: history_log before insert or delete or update for each row execute log_event priority 0.000 enable Creator: joe Lock Level: RECORD Table #: 8 Records: 12 Record size: 36
下記にトリガからのサンプル出力を示します。
INSERT loans VALUES (5, 'Mosca', '2 Mar 1998', '999' 3, 'Jones', '7 Feb 1998', '800'); +++ Trigger Procedure +++ log_ins_upd_del for table 'loans' time: Tue Mar 3 10:55:49 1998 No Old Record New number = '5' New name = 'Mosca' New date = '2 March 1998' New amount = '$999.00' +++ Trigger Procedure +++ log_ins_upd_del for table 'loans' time: Tue Mar 3 10:55:49 1998 No Old Record New number = '3' New name = 'Jones' New date = '7 February 1998' New amount = '$800.00' UPDATE loans SET amount = '999.99' WHERE date > '31 Dec 1997'; +++ Trigger Procedure +++ log_ins_upd_del for table 'loans' time: Tue Mar 3 10:55:49 1998 Old number = '5' Old name = 'Mosca' Old date = '2 March 1998' Old amount = '$999.00' New number = '5' New name = 'Mosca' New date = '2 March 1998' New amount = '$999.99' DELETE loans WHERE amount > 800; +++ Trigger Procedure +++ log_ins_upd_del for table 'loans' time: Tue Mar 3 10:55:49 1998 Old number = '5' Old name = 'Mosca' Old date = '2 March 1998' Old amount = '$999.99' No New Record
上記のトリガがFOR EACH ROWオプションなしで定義された場合には、
INSERT loans VALUES (5, 'Mosca', '2 Mar 1998', '999' 3, 'Jones', '7 Feb 1998', '800');
以下のような表示を行います。
+++ Trigger Procedure +++ log_ins_upd_del for table 'loans' time: Tue Mar 3 10:55:49 1998 No Old Record New number = '5' New name = 'Mosca' New date = '2 March 1998' New amount = '$999.00' No Old Record New number = '3' New name = 'Jones' New date = '7 February 1998' New amount = '$800.00'
DROP TRIGGERコマンドはデータベースデータディクショナリーから トリガ定義を削除します。
Syntax
DROP TRIGGER trigger_name
説明
trigger_name | トリガ名。 |
注意
DROP TRIGGERはデータディクショナリーからトリガ定義を削除します。 トリガを削除しますがモジュール手続きは削除しません。モジュール手続きを削除する にはDROP MODULEを使用してください。
トリガ定義を削除する代わりにALTER TABLEコマンドの使用により 一時的にトリガを無効または有効になることができます。
必要な特権
ALTER特権
例
トリガhistory_logを削除します。
DROP TRIGGER history_log;
loansテーブルのデータディクショナリーからトリガを削除します。
DISPLAY DATABASEコマンドは、データベースの名前、およびデータベース 中のテーブルの名前を表示します。
Syntax
DISPLAY | |DATABASE |DB |
| [database] [ON [TABLE] | |
|table |[NOT] match_op pattern |
|] | |
[ALL] [DUMP] | [ | |INTO |ONTO |
| file]; | |
説明
match_op | 次のいずれか1つLIKE, MATCH, !MATCH, SMATCH, !SMATCH。 |
pattern | WHERE句で指定するパターン。引用符で囲む必要があります。 |
file | ファイル名。 |
注意
キーワードDATABASEは、DBと指定することができます。
データベース名が指定された場合、指定されたデータベース中のテーブルの名 がリストされます。データベース名が指定されない場合、現在のデータベース中の テーブルの名がリストされます。
テーブル名が指定された場合、そのテーブルのための情報だけが表示され ます。パターン・マッチが指定された場合、パターンと一致するテーブルの情報が表示 されます。
ALLが指定された場合、データベース中の各ユーザに作成された テーブルの構造も表示されます。DUMPは単なるデータベース中のテーブル名 をリストして、簡潔な形式で表示します。ALLがDUMPと共に使用 される場合、テーブル定義を含んで簡潔な形式で表示します。
INTO fileまたはONTO fileが指定された 場合、出力はターミナルへではなく指定されたファイルへ送られます。ONTO は追記し、INTOは既存のファイルを上書きします。両方ともファイルが無い 場合には、ファイルを作成します。
データベースにテーブルがない場合、コマンドは単なるデータベースの名前を 表示します。
データベース中のテーブルと共に表示されます。
必要な特権
データベース自体を表示するのに特権は必要しないが、テーブルについては SELECT特権が必要となります。
例
データベース中の全てのテーブルを表示すます。
以下のコマンドでデータベース中の全テーブルを表示します。
DISPLAY DB;
以下の表示を行います。
**** Database: repairs **** auto parts customers loans personnel
全てのテーブルについて構造も表示します。
全てのテーブルについて構造も表示します。
DISPLAY DB ALL;
以下の表示を行います。
***Database: repairs **** *** Table: auto parts *** supplier char(20,1) Not Null phone char(8,1) part name char(25,1) part no. longinteger price dollar(4,1) *** Table: customers *** name char(20,1) Not Null address text(30,124,30,1) comments text(25,1,80,1) *** Table: loans *** number integer name char(25,1) date date(1) amount dollar(6,1) *** Table: personnel *** number integer name char(25,1) phone char(15,1) credit_limit dollar(6,1)
指定されたテーブルの構造を表示します。
loansテーブルの構造を表示します。
DISPLAY DB ON loans ALL;
以下の表示を行います。
**** Database: repairs **** *** Table: loans *** number integer name char(25,1) date date(1) amount dollar(6,1)
データベース中の全てのテーブル名をファイルに保存します。
下のコマンドで全テーブル名をdblistファイルへ保存します。
DISPLAY DB INTO 'dblist';