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

¿Cómo restablezco automáticamente el valor de una secuencia a 0 cada año en Oracle 10g?

Las secuencias no están realmente diseñadas para reiniciarse. Pero hay algunos casos en los que es deseable restablecer una secuencia, por ejemplo, al configurar datos de prueba o fusionar datos de producción en un entorno de prueba. Este tipo de actividad no normalmente se hace en producción.

SI este tipo de operación se va a poner en producción, debe probarse a fondo. (Lo que más preocupa es la posibilidad de que el procedimiento de reinicio se realice accidentalmente en el momento equivocado, como a mediados de año.

Dejar caer y recrear la secuencia es un enfoque. Como operación, es bastante sencillo en lo que respecta a la SECUENCIA:

 DROP SEQUENCE MY_SEQ; CREAR SECUENCIA MY_SEQ COMENZAR CON 1 INCREMENTO POR 1 MINVALUE 0;

[EDITAR] Como señala correctamente Matthew Watson, cada declaración DDL (como DROP, CREATE, ALTER) provocará una confirmación implícita. [/EDITAR]

Sin embargo, se eliminarán todos los privilegios otorgados en SEQUENCE, por lo que será necesario volver a otorgarlos. Cualquier objeto que haga referencia a la secuencia será invalidado. Para que esto sea más generalizado, deberá guardar los privilegios (antes de descartar la secuencia) y luego volver a otorgarlos.

Un segundo enfoque es ALTERAR una SECUENCIA existente, sin descartarla y recrearla. Se puede restablecer la secuencia cambiando el valor INCREMENT a un valor negativo (la diferencia entre el valor actual y 0), y luego hacer exactamente un .NEXTVAL para establecer el valor actual en 0, y luego cambiar INCREMENT nuevamente a 1. He usado este mismo enfoque antes (manualmente, en un entorno de prueba), para establecer una secuencia en un valor mayor también.

Por supuesto, para que esto funcione correctamente, debe asegurarse ninguna otra sesión hace referencia a la secuencia mientras se realiza esta operación. Un .NEXTVAL adicional en el momento equivocado arruinará el reinicio. (NOTA:lograrlo en el lado de la base de datos será difícil, si la aplicación se conecta como propietaria de la secuencia, en lugar de como un usuario separado).

Para que suceda todos los años, debe programar un trabajo. El restablecimiento de la secuencia deberá coordinarse con el restablecimiento de la parte YYYY de su identificador.

He aquí un ejemplo:

http://www.jaredstill.com/content/reset-sequence.html

[EDITAR]

NO PROBADO marcador de posición para un posible diseño de un bloque PL/SQL para restablecer la secuencia

 declare pragma transacción_autonómica; ln_número de incremento; número ln_curr_val; ln_reset_increment número; ln_reset_val número; comenzar:guarde el valor INCREMENT actual para la secuencia seleccione increment_by en ln_increment from user_sequences donde nombre_secuencia ='MY_SEQ'; -- determine el valor de incremento necesario para restablecer la secuencia -- desde el siguiente valor obtenido hasta 0, seleccione -1 - MY_SEQ.nextval en ln_reset_increment from dual; -- obtener el siguiente valor (para convertirlo en el valor actual) seleccionar MY_SEQ.nextval en ln_curr from dual; -- cambiar el valor de incremento de la secuencia a EJECUTAR INMEDIATO 'alterar el incremento de secuencia MY_SEQ por ' || ln_reset_incremento ||' valor mínimo 0'; -- avance la secuencia para establecerla en 0 seleccione MY_SEQ.nextval en ln_reset_val de dual; -- establece el incremento de nuevo al valor anterior (salvado) EJECUTAR INMEDIATO 'alterar secuencia MY_SEQ incremento por ' || ln_incremento; final; //pre> 

NOTAS:

  • ¿cómo proteger mejor la secuencia del acceso mientras se restablece, RENOMBRARLA?
  • Varios casos de prueba para trabajar aquí.
  • Primer paso, verifique los casos normativos de secuencia positiva, ascendente, de incremento 1.
  • ¿Sería un mejor enfoque crear una nueva SECUENCIA, agregar permisos, cambiar el nombre de las secuencias nuevas y existentes y luego volver a compilar las dependencias?