Las reglas de base de datos en SQL Server pueden ser una herramienta poderosa para hacer cumplir la integridad de los datos y asegurarse de que solo se inserten datos válidos en una columna. Sin embargo, estas reglas están siendo descontinuadas en futuras versiones de SQL Server, y se recomienda reemplazarlas con restricciones CHECK. En este artículo, exploraremos cómo identificar y generar un script de estas reglas ocultas, y cómo reemplazarlas con restricciones CHECK.
Identificando Reglas de Base de Datos
Encontrar reglas que están vinculadas a columnas no es una tarea fácil. Mientras que puedes ver las reglas listadas bajo Programación\Reglas en Management Studio, encontrar dónde y a qué están vinculadas es la otra mitad de la historia. Para identificar estas reglas ocultas, puedes escribir una consulta contra las vistas del sistema. Por ejemplo:
SELECT o.name AS NombreTabla,
c.name AS NombreColumna,
(SELECT name FROM sys.objects WHERE object_id=c.rule_object_id) AS NombreRegla
FROM sys.columns AS c
INNER JOIN sys.objects AS o ON c.object_id=o.object_id
WHERE o.is_ms_shipped <> 1 AND rule_object_id <> 0
Esta consulta mostrará las reglas, columnas y la tabla a la que están vinculadas en la base de datos.
Reemplazando Reglas de Base de Datos con Restricciones CHECK
Una vez que hayas identificado las reglas, es importante reemplazarlas con restricciones CHECK. Las restricciones CHECK se crean utilizando la palabra clave CHECK en las declaraciones CREATE TABLE o ALTER TABLE. Te permiten especificar los valores aceptables que se pueden insertar en una columna. Se pueden definir múltiples restricciones en una o varias columnas.
Para reemplazar las reglas, puedes generar un script que desvincule las reglas de las columnas. Por ejemplo:
DECLARE UnBindRule CURSOR READ_ONLY FOR
SELECT o.name AS NombreTabla,
c.name AS NombreColumna,
(SELECT name FROM sys.objects WHERE object_id=c.rule_object_id) AS NombreRegla
FROM sys.columns AS c
INNER JOIN sys.objects AS o ON c.object_id=o.object_id
WHERE o.is_ms_shipped <> 1 AND rule_object_id <> 0
DECLARE @NombreTabla varchar(766)
DECLARE @NombreColumna VARCHAR(766)
DECLARE @NombreRegla VARCHAR(255)
OPEN UnBindRule
FETCH NEXT FROM UnBindRule INTO @NombreTabla,@NombreColumna,@NombreRegla
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
DECLARE @mensaje varchar(4000)
SELECT @mensaje = 'SP_UNBINDRULE ' + '''' + QUOTENAME(@NombreTabla) + '.' + QUOTENAME(@NombreColumna) + ''''
SELECT @mensaje = @mensaje + char(13)
SELECT @mensaje = @mensaje + ' GO '
PRINT @mensaje
END
FETCH NEXT FROM UnBindRule INTO @NombreTabla,@NombreColumna,@NombreRegla
END
CLOSE UnBindRule
DEALLOCATE UnBindRule
Este script generará las declaraciones para desvincular las reglas de columna de tu base de datos. Una vez que las reglas hayan sido desvinculadas, puedes eliminarlas de la base de datos y reemplazarlas con restricciones CHECK.
Conclusión
En este artículo, hemos discutido cómo identificar y reemplazar reglas de base de datos en SQL Server. Es importante reemplazar estas reglas con restricciones CHECK, como recomienda Microsoft, para garantizar la integridad de los datos y la compatibilidad con futuras versiones de SQL Server. Al comprender y generar un script de estas reglas ocultas, puedes planificar eficazmente la eliminación de reglas obsoletas de tus soluciones de base de datos.