次の方法で共有


sp_bindrule (Transact-SQL)

適用対象: SQL Server Azure SQL データベース

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

重要

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

Transact-SQL 構文表記規則

構文

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

引数

[ @rulename = ] N'rulename'

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

[ @objname = ] N'objname'

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

ルールは、 textntextimagevarchar(max)nvarchar(max)varbinary(max)xml、CLR ユーザー定義型、または timestamp 列にバインドできません。 ルールを計算列にバインドすることはできません。

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

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

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

[ @futureonly = ] 'futureonly'

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

リターン コードの値

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

解説

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

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

別名データ型の既存の列は、 @futureonlyfutureonlyとして指定されていない限り、新しい規則を継承します。 別名データ型で定義された新しい列は、常にルールを継承します。 ただし、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_ssnssn にバインドします。 CREATE TABLE ステートメントでは、型の列ssnrule_ssn規則を継承します。 ssn型の既存の列も、@futureonlyに対してfutureonlyが指定されていない限り、rule_ssnルールを継承するか、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.