SQL Server: verifique la restricción en una columna donde los valores provienen de otra tabla

StackOverflow https://stackoverflow.com/questions/3200795

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top