sp_bindrule (Transact-SQL)

ルールを列または別名データ型にバインドします。

重要な注意事項重要

この機能は、Microsoft SQL Server の将来のバージョンで削除されます。新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションはできるだけ早く修正してください。代わりに CHECK 制約を使用してください。CHECK 制約は、CREATE TABLE ステートメントまたは ALTER TABLE ステートメントの CHECK キーワードを使用して作成されます。

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

構文

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.