sql >> Base de Datos >  >> RDS >> Oracle

Creación de disparadores

Lo que tiene aquí es una restricción de tabla de filas cruzadas, es decir, no puede simplemente poner una sola CONSTRAINT de Oracle en una columna, ya que estos solo pueden ver datos dentro de una sola fila a la vez.

Oracle tiene soporte para solo dos tipos de restricciones de filas cruzadas:unicidad (por ejemplo, claves primarias y restricciones únicas) e integridad referencial (claves externas).

En su caso, tendrá que codificar manualmente la restricción usted mismo, y eso conlleva la responsabilidad de asegurarse de que la restricción no se viole en presencia de varias sesiones, cada una de las cuales no puede ver los datos insertados/actualizados por otras sesiones simultáneas. (al menos, hasta que se comprometan).

Un enfoque simplista es agregar un activador que emita una consulta para contar cuántos registros entran en conflicto con el nuevo registro; pero esto no funcionará porque el activador no puede ver las filas que otras sesiones han insertado/actualizado pero que aún no se han confirmado; por lo tanto, el activador a veces permitirá a los miembros alquilar 6 videos, siempre que (por ejemplo) tengan dos cajeros para ingresar los datos en terminales separados.

Solo ida para solucionar este problema es poner algún elemento de serialización, p. el activador primero solicitaría un bloqueo en el registro del miembro (por ejemplo, con SELECCIONAR PARA ACTUALIZAR) antes de que se le permita verificar los alquileres; De esa manera, si una segunda sesión intenta insertar alquileres, esperará hasta que la primera sesión realice una confirmación o reversión.

Otra forma solucionar este problema es utilizar una vista materializada de agregación, que se basaría en una consulta diseñada para encontrar las filas que fallan en la prueba; la expectativa es que el MV esté vacío, y usted pone una restricción de tabla en el MV de tal manera que si alguna vez apareciera una fila en el MV, se violaría la restricción. El efecto de esto es que cualquier declaración que intente insertar filas que violen la restricción provocará una violación de la restricción cuando se actualice el MV.

Escribir la consulta para esto en función de su diseño se deja como un ejercicio para el lector :)