CREATE RULE (Transact-SQL)

ルールと呼ばれるオブジェクトを作成します。ルールを列または別名データ型にバインドすると、その列に挿入できる適切な値を制限できます。

ms188064.note(ja-jp,SQL.90).gif重要 :
CREATE RULE は、将来のバージョンの Microsoft SQL Server では削除される予定です。新しい開発作業では、CREATE RULE の使用は避け、現在このオプションを使用しているアプリケーションは修正するようにしてください。代わりに CHECK 制約を使用することをお勧めします。CHECK 制約は、CREATE TABLE または ALTER TABLE の CHECK キーワードを使用して作成します。詳細については、「CHECK 制約」を参照してください。

1 つの列または別名データ型にバインドできるルールは 1 つだけです。ただし、1 つの列には 1 つのルールと複数の CHECK 制約を関連付けることができます。この場合、すべての制限が評価されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

CREATE RULE [ schema_name . ] rule_name 
AS condition_expression
[ ; ]

引数

schema_name

ルールが属しているスキーマの名前を指定します。

rule_name

新しいルールの名前を指定します。ルール名は、識別子の規則に従っている必要があります。ルールの所有者名の指定は省略可能です。

condition_expression

ルールを定義する条件を指定します。ルールには、WHERE 句で有効な任意の式を指定できます。また、算術演算子、関係演算子、述語 (IN、LIKE、BETWEEN など) といった要素も使用できます。ルールでは、列や別のデータベース オブジェクトを参照することはできません。ただしデータベース オブジェクトを参照しない組み込み関数は使用できます。またユーザー定義関数は使用できません。

condition_expression には変数が 1 つ含まれます。それぞれのローカル変数の前には、アット マーク (@) を付けます。指定する式は、UPDATE または INSERT ステートメントで入力された値を参照します。ルールを作成するときには、任意の名前または記号で値を表すことができますが、最初の文字はアット マーク (@) にする必要があります。

ms188064.note(ja-jp,SQL.90).gifメモ :
別名データ型を使用する式にルールを作成することはお勧めできません。別名データ型を使用する式にルールを作成することはできますが、ルールを列または別名データ型にバインドすると、参照時にこの式は失敗します。

解説

CREATE RULE は、単一のバッチ内で他の Transact-SQL ステートメントと組み合わせて使用することはできません。ルールを作成した時点では、データベース内の既存のデータにルールは適用されません。また、ルールをシステム データ型にバインドすることはできません。詳細については、「データ型 (データベース エンジン)」を参照してください。

ルールは、現在のデータベース内でのみ作成できます。ルールを作成したら、sp_bindrule を実行してルールを列または別名データ型にバインドします。ルールと列のデータ型の間には互換性がとれている必要があります。たとえば、数値型列のルールとして "@value LIKE A%" は使用できません。textntextimagevarchar(max)nvarchar(max)varbinary(max)xmltimestamp 型の列や CLR ユーザー定義型の列にルールをバインドすることはできません。また、計算列にもバインドできません。

文字および日付定数は、必ず単一引用符 (') で囲み、バイナリ定数は 0x で始めてください。ルールとバインド先の列の間に互換性がとれていない場合、SQL Server データベース エンジンでは、ルールがバインドされたときではなく値が挿入されたときにエラー メッセージが返されます。

別名データ型にバインドされたルールは、別名データ型のデータベース列に値を挿入するとき、または列を更新するときにのみアクティブになります。ルールでは変数はテストされないため、別名データ型変数には、同じデータ型の列にバインドしたルールによって拒否されるような値を割り当てないでください。

ルールに関するレポートを取得するには、sp_help を使用します。ルールのテキストを表示するには、ルール名をパラメータに使用して sp_helptext を実行します。ルール名を変更するには、sp_rename を使用します。

同じ名前の新しいルールを作成するときには、まず sp_unbindrule を実行して現在のルールのバインドを解除し、次に DROP RULE を使用してルールを削除する必要があります。列からルールのバインドを解除するには、sp_unbindrule を使用します。

以前のルールのバインドを解除せずに、新しいルールを列またはデータ型にバインドすることができます。新しいルールは以前のルールよりも優先されます。列にバインドされているルールは、別名データ型にバインドされているルールよりも常に優先されます。ルールを列にバインドすると、その列の別名データ型に既にバインドされていたルールは新しいルールに置き換えられますが、ルールをデータ型にバインドしても、その別名データ型の列にバインドされていたルールは新しいルールに置き換えられません。次の表は、ルールが既に存在する列および別名データ型にルールをバインドするときの優先順位です。

新しいルールのバインド先 前のルールのバインド先が 別名データ型の場合 前のルールのバインド先が 列の場合

別名データ型

前のルールが置き換えられる

変更なし

前のルールが置き換えられる

前のルールが置き換えられる

列に既定値とルールの両方が関連付けられている場合、既定値はルールによって定義されるドメイン内のものであることが必要です。ルールに反する既定値は挿入されません。SQL Server データベース エンジンでは、既定値の挿入が試行されるたびにエラー メッセージが生成されます。

ms188064.note(ja-jp,SQL.90).gifメモ :
データベース エンジンで空文字列が 1 つの空白文字と解釈されるか、実際の空文字列と解釈されるかは、互換性レベルの設定によって決まります。互換性レベルが 65 以下の場合、データベース エンジンでは空文字列が 1 つの空白文字として解釈されます。互換性レベルが 70 の場合、データベース エンジンでは空文字列が空文字列として解釈されます。詳細については、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

権限

CREATE RULE を実行するには、少なくとも現在のデータベースの CREATE RULE 権限と、ルールを作成するスキーマの ALTER 権限が必要です。

A. 範囲を指定してルールを作成する

次の例で作成するルールは、ルールのバインド先となる列に挿入できる整数の範囲を制限します。

CREATE RULE range_rule
AS 
@range>= $1000 AND @range <$20000;

B. リストを指定してルールを作成する

次の例で作成するルールは、ルールのバインド先となる列に挿入できる値を、指定したリストの値に制限します。

CREATE RULE list_rule
AS 
@list IN ('1389', '0736', '0877');

C. パターンを指定してルールを作成する

次の例では、任意の文字 2 つの後にハイフン (-)、その後に任意の数の文字 (または文字なし)、最後に 09 の整数 1 文字というパターンを指定するルールを作成します。

CREATE RULE pattern_rule 
AS
@value LIKE '__-%[0-9]'

参照

関連項目

ALTER TABLE (Transact-SQL)
CREATE DEFAULT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DROP DEFAULT (Transact-SQL)
DROP RULE (Transact-SQL)
式 (Transact-SQL)
sp_bindrule (Transact-SQL)
sp_help (Transact-SQL)
sp_helptext (Transact-SQL)
sp_rename (Transact-SQL)
sp_unbindrule (Transact-SQL)
WHERE (Transact-SQL)

その他の技術情報

バッチ
オブジェクト名としての識別子の使用

ヘルプおよび情報

SQL Server 2005 の参考資料の入手