sp_bindrule (Transact-SQL)
適用対象: SQL Server Azure SQL データベース
ルールを列または別名データ型にバインドします。
重要
この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに、 Unique 制約と check 制約を使用 。 CHECK 制約は、CREATE TABLE または
構文
sp_bindrule
[ @rulename = ] N'rulename'
, [ @objname = ] N'objname'
[ , [ @futureonly = ] 'futureonly' ]
[ ; ]
引数
[ @rulename = ] N'rulename'
CREATE RULE
ステートメントによって作成されたルールの名前。 @rulename は nvarchar(776)で、既定値はありません。
[ @objname = ] N'objname'
テーブルと列、またはルールをバインドするエイリアス データ型。 @objname は nvarchar(776)で、既定値はありません。
ルールは、 text、 ntext、 image、 varchar(max)、 nvarchar(max)、 varbinary(max)、 xml、CLR ユーザー定義型、または timestamp 列にバインドできません。 ルールを計算列にバインドすることはできません。
@objname は既定値なしで nvarchar(776) です。 @objnameが 1 部構成の名前の場合は、別名データ型として解決されます。 2 部構成または 3 部構成の名前の場合、最初にテーブルと列として解決されます。この解決が失敗した場合は、別名データ型として解決されます。 既定では、ルールが列に直接バインドされていない限り、エイリアス データ型の既存の列は @rulename を継承します。
@objname は、角かっこ ([
および ]
) 文字を区切り記号付き識別子文字として含めることができます。 詳細については、「 Database 識別子」を参照してください。
別名データ型を使用する式に対して作成されたルールは、列または別名データ型にバインドできますが、参照されるとコンパイルに失敗します。 別名データ型に対して作成されたルールは使用しないでください。
[ @futureonly = ] 'futureonly'
ルールを別名データ型にバインドする場合にのみ使用されます。 @futureonly は varchar(15) で、既定値は NULL
です。 このパラメーターを futureonly
に設定すると、別名データ型の既存の列が新しい規則を継承できなくなります。 @futureonlyがNULL
場合、新しいルールは、現在ルールがない、またはエイリアス データ型の既存のルールを使用しているエイリアス データ型の列にバインドされます。
リターン コードの値
0
(成功) または 1
(失敗)。
解説
新しい規則を列にバインドするか (ただし、 CHECK
制約を使用することをお勧めします)、または既存の規則のバインドを解除せずに、 sp_bindrule
を持つ別名データ型にバインドできます。 元のルールはオーバーライドされます。 ルールが既存の CHECK
制約を持つ列にバインドされている場合、すべての制限が評価されます。 規則を SQL Server データ型にバインドすることはできません。
規則は、バインドではなく、 INSERT
ステートメントが試行されるときに適用されます。 文字ルールは、 numeric データ型の列にバインドできますが、このような INSERT
操作は有効ではありません。
別名データ型の既存の列は、 @futureonly が 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
規則を継承します。 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.