CREATE RULE (Transact-SQL)
ルールと呼ばれるオブジェクトを作成します。ルールを列または別名データ型にバインドすると、その列に挿入できる適切な値を制限できます。
重要 |
---|
この機能は、将来のバージョンの Microsoft SQL Server では削除される予定です。新しい開発作業では、この機能の使用を避け、現在この機能を使用しているアプリケーションは修正するようにしてください。代わりに CHECK 制約を使用することをお勧めします。CHECK 制約は、CREATE TABLE または ALTER TABLE の CHECK キーワードを使用して作成します。詳細については、「CHECK 制約」を参照してください。 |
1 つの列または別名データ型にバインドできるルールは 1 つだけです。ただし、1 つの列には 1 つのルールと複数の CHECK 制約を関連付けることができます。この場合、すべての制限が評価されます。
構文
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]'
関連項目