CREATE RULE (Transact-SQL)

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

重要な注意事項重要

この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。 新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。代わりに 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 ステートメントで入力された値を参照します。ルールを作成するときには、任意の名前または記号で値を表すことができますが、最初の文字はアット マーク (@) にする必要があります。

    注意注意

    別名データ型を使用する式にルールを作成することはお勧めできません。別名データ型を使用する式にルールを作成することはできますが、ルールを列または別名データ型にバインドすると、参照時にこの式は失敗します。

説明

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

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

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

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

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

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

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

新しいルールのバインド先

前のルールのバインド先が

別名データ型の場合

前のルールのバインド先が

列の場合

別名データ型

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

変更なし

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

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

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

権限

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 つの後にハイフン (-)、その後に任意の数の文字 (または文字なし)、最後に 0 ~ 9 の整数 1 文字というパターンを指定するルールを作成します。

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