2012-04-16 8 views
5

En el trabajo tenemos una tabla para guardar los ajustes que contiene esencialmente las siguientes columnas:actualización Prevenir a filas inexistentes

  • PARAMNAME
  • VALUE

La mayoría de las veces los ajustes nuevos se agregado, pero en raras ocasiones, se eliminan las configuraciones. Desafortunadamente, esto significa que cualquier script que haya actualizado previamente este valor seguirá haciéndolo a pesar de que la actualización dé como resultado "0 rows updated" y genere un comportamiento inesperado.

Esta situación fue recobrada recientemente por una falla de prueba de regresión, pero solo después de mucha investigación sobre por qué los datos en el sistema eran diferentes.

Así que mi pregunta es: ¿Hay alguna manera de generar una condición de error cuando una actualización da como resultado cero filas actualizadas?

Estas son algunas de las opciones que he pensado, pero ninguno de ellos son realmente tan deseable:

  • PL envoltura/SQL, que da cuenta del error de actualización y se produce una excepción.
    • No es ideal ya que no detiene a nadie/a que una secuencia de comandos realice una actualización manualmente.
  • Un disparador en la mesa que arroja una excepción.
    • Va en contra de nuestra política actual de eliminación progresiva de desencadenantes.
    • Requiere el activador de actualización cada vez que se elimina una configuración y mantiene una lista de configuraciones obsoletas (si se realiza la exclusión).
    • Puede tener problemas con la tabla de mutación (si se hace inclusión al consultar qué configuraciones existen actualmente).
+0

¿Cómo puede una actualización de 0 filas conducir a la IS tuación de que los datos son diferentes? –

+0

@TheNail La configuración en cuestión fue un retraso. En el código anterior, el valor se actualizaba y los datos incluían el retraso especificado. En el nuevo código, no fue así. Regresión de Ergo Exactamente lo mismo hubiera sucedido si la configuración estuviera controlando si alguna característica se activó o no. –

Respuesta

1

No es realmente una solución, sino un método para organizar un poco las cosas:

Crear una tabla separada con las definiciones de parámetros y enlace a la mesa de la tabla de valores de parámetros. Haga la referencia a la definición de parámetro requerida (no se permiten nulos).

tabla de definición PARAMS (ID, NAME)

Ajuste propio mesa PARAM_VALUES (PARAM_ID, VALUE)

(cambiando su estructura de la tabla es también una manera muy efectiva para provocar errores en los scripts que no han sido actualizados ...)

3

Un PL/Contenedor SQL parece la mejor opción para mí. Los desencadenantes son una gran cosa para eliminar, con la excepción de generar secuencias e insertar registros de historial.

Si le preocupa que alguien actualice manualmente en lugar de utilizar el contenedor PL/SQL, simplemente restrinja la función de usuario para que no tenga privilegios de ACTUALIZACIÓN en la tabla pero tenga privilegios de EJECUTAR sobre el procedimiento.

1

Puede ser que usted puede utilizar instrucción MERGE Aquí hay un enlace para que

http://www.oracle-developer.net/display.php?id=203

La declaración de combinación le permite combinar la inserción y actualización en la misma consulta, por lo que en caso de que la fila deseada no lo hace existes puede insertar un registro en una tabla de tampones para indicar el la fila no existe o bien puede actualizar el registro requerido

creo que sirve

+0

Buena idea, pero esto tiene el mismo problema que una actualización simple, ya que requiere que alguien note que hay nuevos registros en la tabla de búfer. Si pudieran notar esto, podrían notar fácilmente las 0 filas actualizadas. Pero ellos no. Estoy tratando de diseñar la posibilidad de error humano. –

Cuestiones relacionadas