sp_bindrule (Transact-SQL)

適用対象:SQL ServerAzure SQL Database

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

重要

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

Transact-SQL 構文表記規則

構文

sp_bindrule
    [ @rulename = ] N'rulename'
    , [ @objname = ] N'objname'
    [ , [ @futureonly = ] 'futureonly' ]
[ ; ]

引数

[ @rulename = ] N'rulename'

ステートメントによって作成されたルールの CREATE RULE 名前。 @rulenameは nvarchar(776) で、既定値はありません。

[ @objname = ] N'objname'

テーブルと列、またはルールをバインドするエイリアス データ型。 @objnameは nvarchar(776)で、既定値はありません。

ルールは、テキスト、ntextimagevarchar(max)、nvarchar(max)varbinary(max)xmlCLR ユーザー定義型、またはタイムスタンプ列にバインドできません。 ルールを計算列にバインドすることはできません。

@objnameは nvarchar(776) で、既定値はありません。 @objnameが 1 部構成の名前の場合は、別名データ型として解決されます。 2 部構成または 3 部構成の名前の場合、最初にテーブルと列として解決されます。この解決が失敗した場合は、別名データ型として解決されます。 既定では、ルールが列に直接バインドされていない限り、エイリアス データ型の既存の列は@rulenameを継承します。

@objnameは、角かっこ ([および]) 文字を区切り識別子文字として含めることができます。 詳細については、「データベース識別子」を参照してください

別名データ型を使用する式に対して作成されたルールは、列または別名データ型にバインドできますが、参照されるとコンパイルに失敗します。 別名データ型に対して作成されたルールは使用しないでください。

[ @futureonly = ] 'futureonly'

ルールを別名データ型にバインドする場合にのみ使用されます。 @futureonlyは varchar(15) で、既定値は NULL. このパラメーターを futureonly設定すると、エイリアス データ型の既存の列が新しいルールを継承できなくなります。 @futureonlyの場合、新しいルールはNULL、現在ルールがない、またはエイリアス データ型の既存のルールを使用しているエイリアス データ型の列にバインドされます。

リターン コードの値

0 (成功) または 1 (失敗)。

解説

既存の規則をバインド解除せずに、新しい規則を列にバインドするか (ただし、制約を使用 CHECK することをお勧めします)、別名データ型 sp_bindrule にバインドできます。 元のルールはオーバーライドされます。 ルールが既存 CHECK の制約を持つ列にバインドされている場合、すべての制限が評価されます。 規則を SQL Server データ型にバインドすることはできません。

この規則は、バインディングではなく、ステートメントが試行されるときに INSERT 適用されます。 このような操作は有効ではありませんが、文字ルールを数値データ型の列にINSERTバインドできます。

別名データ型の既存の列は、@futureonlyが次のように指定されていない限り、新しい規則をfutureonly継承します。 別名データ型で定義された新しい列は、常にルールを継承します。 ただし、ステートメントの句によって ALTER COLUMN 列の ALTER TABLE データ型がルールにバインドされた別名データ型に変更された場合、そのデータ型にバインドされたルールは列によって継承されません。 規則は、次を使用 sp_bindruleして列に明示的にバインドする必要があります。

ルールを列にバインドすると、関連する情報がテーブルに sys.columns 追加されます。 ルールを別名データ型にバインドすると、関連する情報がテーブルに sys.types 追加されます。

アクセス許可

テーブル列にルールをバインドするには、テーブルに対するアクセス許可が ALTER 必要です。 CONTROL エイリアス データ型に対するアクセス許可、または ALTER 型が属するスキーマに対するアクセス許可は、エイリアス データ型にルールをバインドするために必要です。

A. ルールを列にバインドする

ステートメントを使用してCREATE RULE、現在のデータベースに名前付きのtoday規則が作成されると仮定して、次の例では、テーブルの列に規則をHireDateEmployeeバインドします。 行が Employee テーブルに追加されると、HireDate 列のデータは today ルールと照らし合わせてチェックされます。

USE master;
GO

EXEC sp_bindrule 'today', 'HumanResources.Employee.HireDate';

B. エイリアス データ型にルールをバインドする

rule_ssn という名前のルールがあり、ssn という名前の別名データ型があるものとします。次の例では、rule_ssnssn にバインドします。 ステートメントでは CREATE TABLE 、型 ssn の列はルールを rule_ssn 継承します。 型ssnの既存の列もルールをrule_ssn継承します。ただし、将来@futureonlyに指定されていないかssn、規則が直接バインドされている場合を除きます。 列にバインドされたルールは、常にデータ型にバインドされた既定値よりも優先されます。

USE master;
GO

EXEC sp_bindrule 'rule_ssn', 'ssn';

C: futureonly オプションを使用します

次の例では、rule_ssn ルールを別名データ型 ssn にバインドします。 futureonly が指定されているため、ssn 型の既存の列は影響を受けません。

USE master;
GO

EXEC sp_bindrule rule_ssn, 'ssn', 'futureonly';

D. 区切り記号付き識別子を使用する

次の例は、パラメーターでの 区切り識別子の使用@objname 示しています。

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.