2010-04-11 13 views
6

que estoy tratando de hacer cumplir una restricción CHECK en una base de datos Oracle en varias tablasbase de datos Oracle Hacer cumplir CHECK en varias tablas

... pero me sale el siguiente error:

*Cause: Subquery is not allowed here in the statement. *Action: Remove the subquery from the statement.

Puede me ayudas a entender cuál es el problema o cómo lograr el mismo resultado?

Respuesta

2

Las restricciones de comprobación son muy limitadas en Oracle. Para hacer un control como lo propones, tendrías que implementar un PL/SQL trigger.

Mi consejo sería evitar los factores desencadenantes por completo. Implemente un procedimiento almacenado que modifique la base de datos e incluya las comprobaciones. Los procedimientos almacenados son más fáciles de mantener, aunque son un poco más difíciles de implementar. Pero cambiar una interfaz del acceso directo a la tabla al acceso a procedimientos almacenados se paga muchas veces a largo plazo.

2

Lo que está intentando hacer es asegurarse de que los valores insertados en una tabla existen en otra tabla, es decir, aplicar una clave externa. Por lo que sería:

CREATE TABLE RollingStocks ( 
... 

    CONSTRAINT Pk_RollingStocks Primary Key (Id), 
    CONSTRAINT RollingStocks_CategoryId_FK (RollingStockCategoryId) 
    REFERENCES FreightWagonTypes (ID)  
); 

Excepto que desea aplicar una clave externa que hace referencia a dos tablas. Esto no se puede hacer.

Tienes un par de opciones. Una sería fusionar FreightWagonTypes y LocomotiveClasses en una sola tabla. Si necesita tablas separadas para otras partes de su aplicación, entonces podría construir una vista materializada a los efectos de aplicar la clave externa. Las Vistas Materializadas son como tablas y pueden ser referenciadas por claves externas. Esta opción no funcionará si los valores clave para las dos tablas chocan.

Otra opción es reconocer que la presencia de dos tablas candidatas hace referencia a que RollingStock necesita ser dividido en dos tablas, o quizás tres: un super tipo y dos tablas de subtipo, que es RollingStock y FreightWagons, Locomotives .

Por cierto, ¿qué pasa con los entrenadores de pasajeros, los guardabarros y los carros de restaurante?

+2

Otra alternativa es dividir RollingStockCategoryId en dos columnas que admiten nulos, una como FK a FreightWagonTypes y la otra como FK a LocomotiveClasses. Puede agregar una restricción de verificación para decir que uno (y solo uno) no debe ser nulo para ninguna fila. –

0

Oracle no es compatible con restricciones de comprobación complejas como esa, por desgracia.

En este caso, su mejor opción es cambiar un poco el modelo de datos: agregue una tabla principal sobre FreightWagonTypes y LocomotiveClasses, que contendrá todos los identificadores de ambas tablas. De esta forma, puede agregar un FK a una sola tabla.

Cuestiones relacionadas