CREATE RULE (Transact-SQL)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Analytics Platform System (PDW)
ルールと呼ばれるオブジェクトを作成します。 ルールを列または別名データ型にバインドすると、その列に挿入できる適切な値を制限できます。
重要
この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに CHECK 制約を使用することをお勧めします。 CHECK 制約は、CREATE TABLE または ALTER TABLE の CHECK キーワードを使用して作成されます。 詳細については、「 Unique Constraints and Check Constraints」を参照してください。
1 つの列または別名データ型にバインドできるルールは 1 つだけです。 ただし、1 つの列には 1 つのルールと複数の CHECK 制約を関連付けることができます。 これが True の場合、すべての制限が評価されます。
構文
CREATE RULE [ schema_name . ] rule_name
AS condition_expression
[ ; ]
Note
SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
schema_name
ルールが属しているスキーマの名前を指定します。
rule_name
新しいルールの名前です。 ルール名は、識別子の規則に従っている必要があります。 ルールの所有者名の指定は省略可能です。
condition_expression
ルールを定義する条件を指定します。 ルールには、WHERE 句で有効な任意の式を指定できます。また、算術演算子、関係演算子、述語 (IN、LIKE、BETWEEN など) のような要素も含めることができます。 ルールでは、列や別のデータベース オブジェクトを参照することはできません。 データベース オブジェクトを参照しない組み込み関数は含めることができます。 またユーザー定義関数は使用できません。
condition_expression には 1 つの変数が含まれます。 それぞれのローカル変数の前には、アット マーク ( @ ) を付けます。 この式では、UPDATE または INSERT ステートメントで入力された値を参照します。 ルールを作成するときには、任意の名前または記号で値を表すことができますが、最初の文字はアット マーク ( @ ) にする必要があります。
Note
別名データ型を使用する式にルールを作成することは避けてください。 別名データ型を使用する式にルールを作成することはできますが、ルールを列または別名データ型にバインドすると、参照時にこの式のコンパイルに失敗します。
注釈
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]'
参照
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)