sp_bindrule (Transact-SQL)
ルールを列または別名データ型にバインドします。
重要 |
---|
この機能は、Microsoft SQL Server の将来のバージョンで削除されます。新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションはできるだけ早く修正してください。代わりに CHECK 制約を使用してください。CHECK 制約は、CREATE TABLE ステートメントまたは ALTER TABLE ステートメントの CHECK キーワードを使用して作成されます。 |
構文
sp_bindrule [ @rulename = ] 'rule' ,
[ @objname = ] 'object_name'
[ , [ @futureonly = ] 'futureonly_flag' ]
引数
[ [ @rulename=] 'rule'
CREATE RULE ステートメントによって作成されたルールの名前です。rule は nvarchar(776) であり、既定値はありません。[ [ @objname=] 'object_name'
ルールがバインドされるテーブルと列、または別名データ型です。ルールは text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max)、xml、CLR ユーザー定義型、または timestamp 列にはバインドできません。ルールは、計算列にバインドすることはできません。object_name のデータ型は nvarchar(776) で、既定値はありません。object_name が 1 部構成の名前の場合は、別名データ型として解決されます。2 部構成または 3 部構成の名前の場合は、最初にテーブルおよび列として解決されます。この解決が失敗すると、別名データ型として解決されます。既定では、既存の別名データ型の列は、別のルールを直接その列にバインドしない限り rule の値を継承します。
注 object_name には、角かっこ [ および ] を区切り記号識別子の文字として含めることができます。詳細については、「区切られた識別子 (データベース エンジン)」を参照してください。
注 別名データ型を使用する式に対して作成されたルールは、列または別名データ型にバインドできますが、参照されてもコンパイルできません。別名データ型に対して作成されたルールは使用しないでください。
[ [ @futureonly= ] 'futureonly_flag'
ルールを別名データ型にバインドするときにのみ使用されます。future_only_flag は varchar(15) であり、既定値は NULL です。このパラメータを futureonly に設定すると、別名データ型の既存の列では新しいルールを継承しません。futureonly_flag が NULL の場合、新しいルールは、現在ルールが割り当てられていない別名データ型の列、または別名データ型の既存のルールを使用している列にバインドされます。
リターン コード値
成功した場合は 0 を、失敗した場合は 1 をそれぞれ返します。
説明
sp_bindrule を使用すると、既存のルールをバインド解除せずに、新しいルールを列または別名データ型にバインドできます。ただし、できるだけ CHECK 制約を使用してください。元のルールは無効になります。既に CHECK 制約のある列にルールをバインドすると、すべての制限が評価されます。SQL Server データ型にはルールをバインドできません。
ルールは、バインド時ではなく INSERT ステートメントを試行したときに設定されます。numeric データ型の列には、文字ルールをバインドすることはできますが、INSERT 操作を行うことはできません。
futureonly_flag が futureonly として指定されていない限り、別名データ型の既存の列は新しいルールを継承します。別名データ型が定義された新しい列は、常にルールを継承します。しかし、ALTER TABLE ステートメントの ALTER COLUMN 句によって、列のデータ型をルールがバインドされた別名データ型に変更すると、データ型にバインドしているルールはその列に継承されません。sp_bindrule を使用して、明示的にルールを列にバインドする必要があります。
列にルールをバインドすると、関連情報が sys.columns テーブルに登録されます。別名データ型にルールをバインドすると、関連情報が sys.types テーブルに登録されます。
権限
テーブル列にルールをバインドするには、そのテーブルに対する ALTER 権限が必要です。別名データ型にルールをバインドするには、その別名データ型に対する CONTROL 権限、またはそのデータ型の属するスキーマに対する ALTER 権限が必要です。
例
A. 列にルールをバインドする
CREATE RULE ステートメントを使用して today という名前のルールが現在のデータベースで作成されているものとします。次の例では、Employee テーブルの HireDate 列に、このルールをバインドします。行が Employee テーブルに追加されると、HireDate 列のデータは today ルールと照らし合わせてチェックされます。
USE master;
GO
EXEC sp_bindrule 'today', 'HumanResources.Employee.HireDate'
B. 別名データ型にルールをバインドする
rule_ssn という名前のルールがあり、ssn という名前の別名データ型があるものとします。次の例では、rule_ssn を ssn にバインドします。CREATE TABLE ステートメントで、ssn 型の列は rule_ssn ルールを継承します。futureonly_flag に futureonly が指定されている場合や ssn にルールが直接バインドされている場合を除き、ssn 型の既存の列も rule_ssn ルールを継承します。列にバインドされているルールは、データ型にバインドされているルールより常に優先します。
USE master;
GO
EXEC sp_bindrule 'rule_ssn', 'ssn'
C. futureonly_flag を使用する
次の例では、rule_ssn ルールを別名データ型 ssn にバインドします。futureonly が指定されているため、ssn 型の既存の列は影響を受けません。
USE master;
GO
EXEC sp_bindrule rule_ssn, 'ssn', 'futureonly'
D. 区切られた識別子を使用する
次の例では、object_name パラメータでの区切られた識別子の使い方を示します。
USE master;
GO
CREATE TABLE [t.2] (c1 int)
-- Notice the period as part of the table name.
EXEC sp_bindrule rule1, '[t.2].c1'
-- The object contains two periods;
-- the first is part of the table name
-- and the second distinguishes the table name from the column name.