Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment réinitialiser automatiquement la valeur d'une séquence à 0 chaque année dans Oracle 10g ?

Les séquences ne sont pas vraiment conçues pour être réinitialisées. Mais il existe certains cas où la réinitialisation d'une séquence est souhaitable, par exemple, lors de la configuration des données de test ou de la fusion des données de production dans un environnement de test. Ce type d'activité n'est pas normalement fait en production.

SI ce type d'opération doit être mis en production, il doit être soigneusement testé. (Ce qui suscite le plus d'inquiétude est la possibilité que la procédure de réinitialisation soit accidentellement effectuée au mauvais moment, par exemple au milieu de l'année.

Supprimer et recréer la séquence est une approche. En tant qu'opération, c'est assez simple en ce qui concerne la SEQUENCE :

    DROP SEQUENCE MY_SEQ;
    CREATE SEQUENCE MY_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 0;

[EDIT] Comme le souligne correctement Matthew Watson, chaque instruction DDL (telle que DROP, CREATE, ALTER) entraînera une validation implicite. [/MODIFIER]

Mais, tous les privilèges accordés sur la SEQUENCE seront supprimés, ils devront donc être réaccordés. Tous les objets faisant référence à la séquence seront invalidés. Pour généraliser cela, vous devez enregistrer les privilèges (avant de supprimer la séquence), puis les réattribuer.

Une deuxième approche consiste à MODIFIER une SÉQUENCE existante, sans la supprimer ni la recréer. La réinitialisation de la séquence peut être accomplie en modifiant la valeur INCREMENT en une valeur négative (la différence entre la valeur actuelle et 0), puis en effectuant exactement un .NEXTVAL pour définir la valeur actuelle sur 0, puis en redéfinissant INCREMENT sur 1. J'ai déjà utilisé cette même approche (manuellement, dans un environnement de test), pour définir une séquence sur une valeur plus grande également.

Bien sûr, pour que cela fonctionne correctement, vous devez assurer aucune autre session ne fait référence à la séquence pendant l'exécution de cette opération. Un .NEXTVAL supplémentaire au mauvais moment gâchera la réinitialisation. (REMARQUE :il sera difficile d'y parvenir du côté de la base de données si l'application se connecte en tant que propriétaire de la séquence, plutôt qu'en tant qu'utilisateur distinct.)

Pour que cela se produise chaque année, vous devez planifier un travail. La réinitialisation de la séquence devra être coordonnée avec la réinitialisation de la partie AAAA de votre identifiant.

Voici un exemple :

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

[MODIFIER]

NON TESTÉ espace réservé pour une conception possible d'un bloc PL/SQL pour réinitialiser la séquence

    declare
      pragma autonomous_transaction;
      ln_increment       number;
      ln_curr_val        number;
      ln_reset_increment number;
      ln_reset_val       number;
    begin

      -- save the current INCREMENT value for the sequence
      select increment_by
        into ln_increment
        from user_sequences
       where sequence_name = 'MY_SEQ';

      -- determine the increment value required to reset the sequence
      -- from the next fetched value to 0
      select -1 - MY_SEQ.nextval into ln_reset_increment from dual;

      -- fetch the next value (to make it the current value)
      select MY_SEQ.nextval into ln_curr from dual;

      -- change the increment value of the sequence to 
      EXECUTE IMMEDIATE 'alter sequence MY_SEQ increment by '
        || ln_reset_increment ||' minvalue 0';

      -- advance the sequence to set it to 0
      select MY_SEQ.nextval into ln_reset_val from dual;

      -- set increment back to the previous(ly saved) value
      EXECUTE IMMEDIATE 'alter sequence MY_SEQ increment by '
        || ln_increment ;
    end;
    /

REMARQUES :

  • comment protéger au mieux la séquence contre l'accès pendant sa réinitialisation, la RENOMMER ?
  • Plusieurs cas de test à résoudre ici.
  • Première passe, vérifier les cas normatifs de séquence positive, ascendante, incrément de 1.
  • une meilleure approche serait-elle de créer une nouvelle SÉQUENCE, d'ajouter des autorisations, de renommer les séquences existantes et nouvelles, puis de recompiler les dépendances ?