Bonjour,
Dans la mise à jour de ma base de données, je crée une nouvelle table devant recevoir les données de mon ancienne table.
La clé primaire de l'ancienne table est un id auto incrémenté par un trigger qui récupère la valeur de la séquence créée spécialement pour ça.
L'update de la base de données est stockée dans un script sql qui sera lancé sur les serveurs ayant besoin de l'update et un problème se pose pour moi.
Lorsque je vais remplir ma nouvelle table, je vais faire un truc du genre(grossièrement)
Code : Sélectionner tout - Visualiser dans une fenêtre à part insert into new_table select * from last_table;
Une fois l'insert exécuté, je veux créer la séquence et le trigger pour l'auto incrément de la nouvelle table, mais il faut que le script sache à quelle valeur commencer la séquence (id le plus élevé dans la nouvelle table).
J'ai eu plusieurs idées :
tout d'abord j'ai essayé de créer des séquences comme ceci :
et comme cela
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE SEQUENCE ma_sequence START WITH (SELECT MAX(id) FROM new_table) MINVALUE 0 NOCYCLE NOCACHE ORDER;mais sans succès.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE SEQUENCE ma_sequence START WITH SELECT MAX(id) FROM new_table MINVALUE 0 NOCYCLE NOCACHE ORDER;
J'ai ensuite pensé récupérer l'ancienne séquence en la renommant pour qu'elle corresponde à la nouvelle convention de nomage, mais j'ai eu ceci :
Donc l'utilisateur que j'emploie ne pourra pas faire l'opération dans le script.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SQL> UPDATE user_sequences SET sequence_name='new_name' WHERE sequence_name='last_name'; UPDATE user_sequences SET sequence_name='new_name' WHERE sequence_name='last_name' * ERROR at line 1: ORA-01031: insufficient privileges
Pour info, je mets toutes les requêtes dans un script pour n'avoir qu'à lancer le script sur les serveurs de prod (il faut donc que tout marche du premier coup ! d'ou mes tests)
Quelqu'un aurait-il une idée pour faire fonctionner l'une des deux idées, ou une autre idée qui marchera ?
Merci d'avance
Partager