Partager via


sp_bindrule (Transact-SQL)

Lie une règle à une colonne ou un type de données d'alias.

Important

Cette fonctionnalité sera supprimée dans une prochaine version de Microsoft SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement, et modifiez dès que possible les applications qui utilisent actuellement cette fonctionnalité. Utilisez les contraintes CHECK à la place. Ces contraintes CHECK sont créées à l'aide du mot clé CHECK des instructions CREATE TABLE ou ALTER TABLE.

Icône Lien de rubriqueConventions de la syntaxe de Transact-SQL

Syntaxe

sp_bindrule [ @rulename = ] 'rule' , 
     [ @objname = ] 'object_name' 
     [ , [ @futureonly = ] 'futureonly_flag' ] 

Arguments

  • [ [ @rulename=] 'rule'
    Nom d'une règle créée par l'instruction CREATE RULE. rule est de type nvarchar(776) et n'a pas de valeur par défaut.

  • [ @objname=] 'object_name'
    Table ou colonne, ou bien type de données d'alias auquel la règle doit être liée. Une règle ne peut pas être associée à un type de données CLR défini par l'utilisateur, text, ntext, image, varchar(max), nvarchar(max), varbinary(max), xml ou à une colonne timestamp. Une règle ne peut pas être liée à une colonne calculée.

    object_name est de type nvarchar(776) et n'a pas de valeur par défaut. Si object_name est un nom à une composante, il est résolu en tant que type de données d'alias. S'il s'agit d'un nom en deux ou trois parties, il est d'abord résolu en tant que table et colonne. Si la résolution échoue, il est résolu en tant que type de données d'alias. Par défaut, les colonnes existantes du type de données d'alias héritent de rule, sauf si une règle a été liée directement à la colonne.

    [!REMARQUE]

    object_name peut contenir les caractères crochet [ et ] comme caractères d'identificateur délimité. Pour plus d'informations, consultez Identificateurs délimités (Moteur de base de données).

    [!REMARQUE]

    Les règles créées sur des expressions utilisant des types de données d'alias peuvent être liées à des colonnes ou des types de données d'alias, mais ne peuvent pas être compilées lorsqu'elles sont référencées. Évitez d'utiliser des règles créées sur des types de données d'alias.

  • [ [ @futureonly= ] 'futureonly_flag'
    S'utilise seulement pour lier une règle à un type de données d'alias. L'argument future_only_flag est de type varchar(15). Sa valeur par défaut est NULL. Ce paramètre, lorsqu'il a la valeur futureonly, empêche les colonnes existantes d'un type de données d'alias d'hériter de la nouvelle règle. Si futureonly_flag a pour valeur NULL, la nouvelle règle est liée à toute colonne du type de données d'alias qui n'a pas de règle à ce moment, ou qui utilise la règle existante du type de données d'alias.

Valeurs des codes renvoyés

0 (succès) ou 1 (échec)

Notes

Vous pouvez lier une nouvelle règle à une colonne (il est toutefois recommandé d'utiliser une contrainte CHECK) ou à un type de données d'alias à l'aide de sp_bindrule sans dissocier une règle existante. L'ancienne règle est remplacée par la nouvelle. Si une règle est associée à une colonne à l'aide d'une contrainte CHECK existante, toutes les restrictions sont évaluées. Vous ne pouvez pas lier de règle à un type de données SQL Server.

La règle s'impose lors d'une tentative d'insertion de données (INSERT) et non au moment de la liaison. Il est possible de lier une règle de type de données caractère à une colonne de type de données numeric, bien qu'une telle opération INSERT ne soit pas valide.

Les colonnes existantes d'un type de données défini par l'utilisateur héritent de la nouvelle règle, sauf si futureonly_flag a la valeur futureonly. Les nouvelles colonnes définies avec le type de données d'alias héritent toujours de la règle. Si la clause ALTER COLUMN d'une instruction ALTER TABLE change le type de données d'une colonne en un type de données d'alias lié à une règle, la colonne n'hérite pas de cette règle liée au type de données. Il convient de lier la règle elle-même à la colonne à l'aide de sp_bindrule.

Lorsque vous liez une règle à une colonne, l'information correspondante est ajoutée à la table sys.columns. Lorsque vous liez une règle à un type de données d'alias, les informations correspondantes sont ajoutées à la table sys.types.

Autorisations

Pour lier une règle à une colonne de table, une autorisation ALTER est nécessaire sur la table. Pour lier une règle à un type de données d'alias, il est nécessaire de disposer d'une autorisation CONTROL sur le type de données d'alias ou d'une autorisation ALTER sur le schéma auquel le type appartient.

Exemples

A. Liaison d'une règle à une colonne

En supposant qu'une règle nommée today ait été créée dans la base de données active par l'instruction CREATE RULE, l'exemple suivant lie la règle à la colonne HireDate de la table Employee. Quand une ligne est ajoutée à la table Employee, SQL Server vérifie si les données fournies pour la colonne HireDate respectent la règle today.

USE master;
GO
EXEC sp_bindrule 'today', 'HumanResources.Employee.HireDate'

B. Liaison d'une règle à un type de données d'alias

En supposant l'existence d'une règle nommée rule_ssn et d'un type de données d'alias nommé ssn, cet exemple lie rule_ssn à ssn. Toutes les colonnes créées par une instruction CREATE TABLE avec le type de données ssn héritent de la règle rule_ssn. Les colonnes existantes de type ssn héritent également de la règle rule_ssn, sauf si futureonly_flag a pour valeur futureonly, ou si ssn a une règle qui lui est directement liée. Les règles liées à des colonnes ont toujours priorité sur les règles liées à des types de données.

USE master;
GO
EXEC sp_bindrule 'rule_ssn', 'ssn'

C. Utilisation de l'argument futureonly_flag

L'exemple suivant lie la règle rule_ssn au type de données d'alias ssn. Puisque l'option futureonly est incluse, aucune colonne existante de type ssn n'est affectée.

USE master;
GO
EXEC sp_bindrule rule_ssn, 'ssn', 'futureonly'

D. Utilisation des identificateurs délimités

Cet exemple montre l'utilisation d'identificateurs délimités dans le paramètre 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.