SQL Server: verifique la restricción en una columna donde los valores provienen de otra tabla
-
12-09-2020 - |
Pregunta
¿Cómo se produce una restricción de verificación en una columna de manera que su rango de valores aceptables proviene de otra tabla, sin codificación dura?
Aquí hay un ejemplo simplificado:
OneManyTable
RoleID TaskID
10 Val1
10 Val2
20 Val1
20 Val2
MetaDataTable
pkID Class Value
1 A Val1
2 A Val2
3 B Val3
4 B Val4
Quiero poner una restricción de cheque en la columna OnemanyTable.taskid, de modo que los valores aceptables provienen de la columna de otras tablas, es decir, de Metadatatable.Value, donde metadatatable.class= 'A'
Ya intenté crear una restricción de verificación del formato
TaskID in (Select Value FROM MetadataTable where class= 'A')
Pero esto no es compatible.
Por otro lado TaskID en ('Val1', 'Val2') funciona como una restricción de cheques en SQL2K8 (¡no en SQL2000!), Pero no es aceptable debido a la codificación dura.
¿Cómo lograr lo que quiero, ya sea a través de la restricción de cheques o algún otro mecanismo de lujo en el que no soy consciente?
ps.Tiene que estar en el lado de la base de datos, no se ha sugerido una verificación del lado del cliente como alguien.
Solución
Probablemente no sea una buena práctica para ingresar, pero puede escribir una función definida por el usuario que acepte su TaskID como un parámetro y que se evalúe con verdadero o falso, dependiendo de si la TaskID cae o no dentro del rango proporcionado entu metadatatable.
Eso le permitirá obtener la funcionalidad que está buscando: verifique las restricciones realmente deben ser funciones simples diseñadas para limitar el rango de una columna y su comportamiento fue diseñado con eso en mente, por esoNo se pueden escribir subconsultas dentro de una restricción de cheques en SQL Server.
Puede escribir una instrucción SELECT dentro de una función definida por el usuario y llámela de una restricción de cheques.
Otros consejos
Una restricción de verificación contra valores de otra tabla normalmente se diseñaría como una restricción de clave externa.Ese es el mecanismo diseñado para vincular la tabla en valores.
Las restricciones de verificación están realmente diseñadas para definir
- valores mínimo o máximo
- rangos
- enumeraciones de un conjunto dado de valores
Entonces, no creo que puedas hacer lo que estás tratando de hacer, porque esa es realmente la característica equivocada que está tratando de usar para eso.