分享方式:


sp_bindrule (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫

將規則系結至數據行或別名數據類型。

重要

SQL Server 的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 請改用 唯一條件約束和檢查條件約束 。 CHECK 條件約束是使用 CREATE TABLE 或 ALTER TABLE 語句的 CHECK 關鍵詞所建立。

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),沒有預設值。

規則無法繫結至 text、ntext、imagevarchar(max)、nvarchar(max)、varbinary(max)xml、CLR 使用者定義類型或 timestamp 數據行。 規則無法系結至計算數據行。

@objname為 nvarchar(776),沒有預設值。 如果 @objname 是一部分名稱,它會解析為別名數據類型。 如果是兩個或三部分的名稱,它會先解析為數據表和數據行;如果此解析失敗,它會解析為別名數據類型。 根據預設,除非規則直接系結至數據行,否則別名數據類型的現有數據行會繼承 @rulename

@objname可以包含括號 ([]) 字元做為分隔標識符字元。 如需詳細資訊,請參閱 資料庫標識符

在使用別名數據類型的表達式上建立的規則可以系結至數據行或別名數據類型,但在參考時無法編譯。 避免使用在別名數據類型上建立的規則。

[ @futureonly = ] 'futureonly'

只有在將規則系結至別名數據類型時才使用。 @futureonly為 varchar(15),預設值為 NULL。 當設定為 futureonly時,此參數會防止別名數據類型的現有數據行繼承新規則。 如果 @futureonlyNULL,則新規則會系結至目前沒有任何規則或使用別名數據類型現有規則的任何別名數據類型數據行。

傳回碼值

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. 將規則系結至數據行

假設使用 語句在目前資料庫中建立名為 today 的規則,下列範例會將規則系結至HireDate數據表的數據EmployeeCREATE RULE行。 當數據列加入至 Employee時,會根據today規則檢查數據行的數據HireDate

USE master;
GO

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

B. 將規則系結至別名數據類型

假設有名為 rule_ssn 的規則和名為 ssn的別名數據類型存在,下列範例會 rule_ssn 系結至 ssnCREATE 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.