マイナーなCREATE文

CREATE ASSERTION

SQL92で標準化された。1つ以上、複数のテーブルに対して制約をかける「表明」を定義する。
実装しているDBMSが少ないため知名度は低いが、DB側で複雑な制限をかけれるため処理速度の改善に繋がるらしい。
ストアドプロシージャとかと同じ理屈か?
(この「表明」と言う考え方はC++などのASSERTチェック等に近いものだと思われる。データ操作時にある条件を判定し、異常である場合はエラーを投げる。)
設定した条件が偽の場合にエラーを発生させることができ、SELECT文を使った複雑な制約を定義することができる。

CREATE ASSERTION 入力値チェック CHECK (NOT EXIST(SELECT * FROM 価格票,限界値 WHERE 価格表.商品コード = 限界値.商品コード AND 価格票.価格 <= 限界値.上限価格))

※表明名が「入力値チェック」、CHECK以降の文が条件である。上記例だと価格票テーブルと限界値テーブルを商品コードで結合して価格が上限価格以下であることを判定している。上限価格以上の価格が設定された場合はエラーを投げる。

CREATE DOMAIN

SQL92で標準化された。ユーザ定義のデータ型を作成する。
実装しているDBMSが少ないため知名度は低いが、DB側で入力値チェックを行えるため処理速度の改善に繋がるらしい。
ASSERTIONと合わせてリファクタリングに使えそう。
CREATE DOMAINをコールしたユーザがそのドメインの管理を行うが、使用に関しては全ユーザが行える。(場合が多い模様。DBMS依存。)

CREATE DOMAIN AGE AS CHECK (VALUE >= 18) AND (VALUE <= 99)

※18〜99までしか値を取らないユーザデータ型「AGE」を作成する。
※条件文で使用する変数名についてはSQL92では未定義?
(PostgreSQLではVALUEだった。というか他のDBMSで例を見つけられなかった。とりあえずPostgreSQLの仕様で例を記載)