CREATE RULE (Transact-SQL)
Crea un objeto denominado regla. Cuando se enlaza a una columna o a un tipo de datos de alias, la regla especifica los valores aceptables que se pueden insertar en esa columna.
Importante |
---|
Esta característica se quitará en una versión futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.Se recomienda utilizar restricciones CHECK en su lugar. Las restricciones CHECK se crean mediante la palabra clave CHECK de CREATE TABLE o ALTER TABLE. Para obtener más información, vea Restricciones UNIQUE y restricciones CHECK. |
Una columna o un tipo de datos de alias solo puede tener enlazada una regla. Sin embargo, una columna puede tener una regla y una o más restricciones CHECK asociadas a ella. Cuando esto es así, se evalúan todas las restricciones.
Convenciones de sintaxis de Transact-SQL
Sintaxis
CREATE RULE [ schema_name . ] rule_name
AS condition_expression
[ ; ]
Argumentos
schema_name
Es el nombre del esquema al que pertenece la regla.rule_name
Es el nombre de la nueva regla. Los nombres de las reglas deben ajustarse a las reglas de los identificadores. La especificación del propietario de la regla es opcional.condition_expression
Es la condición o condiciones que definen la regla. Una regla puede ser cualquier expresión válida en una cláusula WHERE y puede incluir elementos como operadores aritméticos, operadores relacionales y predicados (por ejemplo, IN, LIKE, BETWEEN). Una regla no puede hacer referencia a columnas u otros objetos de base de datos. Se pueden incluir funciones integradas que no hagan referencia a objetos de base de datos. No es posible utilizar funciones definidas por el usuario.condition_expression incluye una variable. El carácter arroba (@) precede a cada variable local. La expresión hace referencia al valor especificado con la instrucción UPDATE o INSERT. Se puede utilizar cualquier nombre o símbolo para representar el valor cuando se crea la regla, pero el primer carácter debe ser la arroba (@).
[!NOTA]
Evite crear reglas en expresiones que utilicen tipos de datos de alias. Aunque es posible crear reglas en expresiones que utilicen tipos de datos de alias, después de enlazar las reglas a las columnas o a los tipos de datos de alias, cuando se hace referencia a las expresiones, éstas no se compilan.
Comentarios
CREATE RULE no se puede combinar con otras instrucciones Transact-SQL en un único lote. Las reglas no se aplican a los datos ya existentes en la base de datos en el momento en que se crean las reglas y no se pueden enlazar a los tipos de datos del sistema.
Una regla solo se puede crear en la base de datos actual. Una vez creada la regla, ejecute sp_bindrule para enlazarla a una columna o a un tipo de datos de alias. Una regla debe ser compatible con el tipo de datos de la columna. Por ejemplo, "@value LIKE A%" no se puede utilizar como regla para una columna numérica. Una regla no se puede enlazar a un tipo text, ntext, image, varchar(max), nvarchar(max), varbinary(max), xml, a un tipo definido por el usuario CLR o a una columna timestamp. Una regla no se puede enlazar a una columna calculada.
Incluya las constantes de fecha y de caracteres entre comillas simples (') y preceda las constantes binarias de 0x. Si la regla no es compatible con la columna a la que se ha enlazado, el Motor de base de datos de SQL Server devuelve un mensaje de error cuando se inserta un valor, pero no cuando se enlaza la regla.
Una regla enlazada a un tipo de datos de alias solo se activa cuando se intenta actualizar o insertar un valor en una columna de la base de datos del tipo de datos de alias. Dado que las reglas no prueban las variables, no asigne un valor a una variable de tipo de datos de alias que sería rechazada por una regla enlazada a una columna del mismo tipo de datos.
Para obtener un informe sobre una regla, utilice sp_help. Para que se muestre el texto de una regla, ejecute sp_helptext con el nombre de la regla como parámetro. Para cambiar el nombre de una regla, utilice sp_rename.
Una regla debe quitarse mediante DROP RULE antes de crear una nueva con el mismo nombre y debe cancelarse el enlace mediante sp_unbindrule antes de quitarla. Para cancelar el enlace de una regla a una columna, utilice sp_unbindrule.
Una nueva regla se puede enlazar a una columna o tipo de datos sin cancelar el enlace de la anterior; la nueva regla anula la anterior. Las reglas enlazadas a columnas siempre tienen prioridad sobre las enlazadas a tipos de datos de alias. Enlazar una regla a una columna sustituye una regla ya enlazada al tipo de datos de alias de esa columna. Sin embargo, el enlace de una regla a un tipo de datos no sustituye una regla enlazada a una columna de ese tipo de datos de alias. La tabla siguiente muestra la prioridad cuando se enlazan reglas a columnas y a tipos de datos de alias en los que ya existen reglas.
Nueva regla enlazada a |
Regla antigua enlazada a Tipo de datos de alias |
Regla antigua enlazada a Columna |
---|---|---|
Tipo de datos de alias |
Regla antigua sustituida |
Sin cambio |
Columna |
Regla antigua sustituida |
Regla antigua sustituida |
Si una columna tiene un valor predeterminado y una regla asociada a ella, el valor predeterminado debe encontrarse en el dominio definido por la regla. Un valor predeterminado que esté en conflicto con una regla no se inserta nunca. El motor de base de datos de SQL Server genera un mensaje de error cada vez que intenta insertar un valor predeterminado con esas características.
Permisos
Para ejecutar CREATE RULE, un usuario necesita, como mínimo, el permiso CREATE RULE en la base de datos actual y el permiso ALTER en el esquema en el que se está creando la regla.
Ejemplos
A. Crear una regla con un intervalo
En el siguiente ejemplo se crea una regla que restringe el intervalo de enteros insertado en las columnas a las que la regla está enlazada.
CREATE RULE range_rule
AS
@range>= $1000 AND @range <$20000;
B. Crear una regla con una lista
En el siguiente ejemplo se crea una regla que restringe los valores reales especificados en las columnas (a las que la regla está enlazada) a solo aquellos enumerados en la regla.
CREATE RULE list_rule
AS
@list IN ('1389', '0736', '0877');
C. Crear una regla con un patrón
En el siguiente ejemplo se crea una regla que sigue un patrón de dos caracteres cualquiera seguidos de un guión (-), cualquier número de caracteres o ningún carácter y un entero entre 0 y 9 al final.
CREATE RULE pattern_rule
AS
@value LIKE '__-%[0-9]'