La vérité sur la commande "RENAME"

La commande rename que vos trouverez dans Oracle 11g SQL Reference n’est pas votre amie ! Pourtant si vous lisez les restrictions de la documentation, vous trouverez, simplement:

Renaming objects is subject to the following restrictions:

  • You cannot rename a public synonym. Instead, drop the public synonym and then re-create the public synonym with the new name.
  • You cannot rename a type synonym that has any dependent tables or dependent valid user-defined object types.

Alors pourquoi faut-il lui préferer alter table mytable rename pour renommer une table? La première réponse vient avec un rapide test:

rename scott.emp to emp2;
*
ERROR at line 1:
ORA-01765: specifying table's owner name is not allowed

Et non! Vous ne pouvez pas préciser le nom du schéma de l’objet que vous voulez renommer; mais vous me direz qu’il y a plusieurs moyens de contourner cette limite; alors voici une seconde raison que vous trouverez dans la section « Types of DDL Changes Ignored by an Apply Process » de la documentation: Si vous utilisez Oracle Streams, vous ne pourrez pas répliquer cette commande. Ou du moins pas sans vous faire un noeud au cerveau!

Mais pourquoi donc? Et bien pour une troisième raison qui n’est pas documentée celle-ci: Vous ne pouvez pas utiliser la commande rename après avoir exécuté alter session set current_schema=...; la preuve:

alter session set current_schema=scott;

rename emp to emp2;
*
ERROR at line 1:
ORA-03001: unimplemented feature

Et oui, rename n’est pas implémenté dans ce contexte; cela explique sans doute pourquoi les process d’apply ne sont pas capables de l’appliquer. Mais, et ça sera la conclusion de ce post, à moins que vous n’ayez une bonne raison pour ne pas utiliser alter table ... rename to ... (et je ne vois pas laquelle !), préférez toujours cette dernière syntaxe au rename: ça évitera quelques soucis à celui ou celle qui passera après vous. A moins, bien sur, que vous ne fassiez tout ça que pour ça…