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 の場合、新しいルールは、現在ルールが割り当てられていない別名データ型の列、または別名データ型の既存のルールを使用している列にバインドされます。
解説
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 権限が必要です。
戻り値
成功した場合は 0 を、失敗した場合は 1 をそれぞれ返します。
例
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.
参照
関連項目
システム ストアド プロシージャ (Transact-SQL)
データベース エンジンのストアド プロシージャ (Transact-SQL)
CREATE RULE (Transact-SQL)
DROP RULE (Transact-SQL)
sp_unbindrule (Transact-SQL)
システム ストアド プロシージャ (Transact-SQL)