Dans cet article, je souhaite partager un exemple de suppression d’une table en base en activant la corbeille Oracle Recyclebin afin de pouvoir, le cas échéant, avoir la possibilité de restaurer des éléments supprimés.
Pour illustrer cette exemple, voici le contexte de tables liées présentes en base :
CREATE TABLE Article ( article_id NUMBER PRIMARY KEY, article_name varchar2(50), code VARCHAR(50) NOT NULL, description VARCHAR(50) NOT NULL ); CREATE TABLE Commande ( commande_id NUMBER PRIMARY KEY, article_id NUMBER NOT NULL, quantite INTEGER NOT NULL, prix DEC(7,2) NOT NULL, CONSTRAINT fk_article FOREIGN KEY (article_id) REFERENCES Article(article_id) ON DELETE CASCADE );
Lorsqu’on souhaite supprimer la table Article, Oracle nous répond naturellement l’erreur suivante :
DROP TABLE Article; -- Revoie une erreur ORA-02449: clés uniques/primaires de la table référencées par des clés étrangères
Avant de réaliser la suppression de la table, on va d’abord s’assurer d’activer la corbeille comme suit :
SHOW PARAMETER RECYCLEBIN; -- Affiche si la corbeille est activée ou non NAME TYPE VALUE ---------- ------ ----- recyclebin string OFF ALTER SESSION SET RECYCLEBIN= ON; -- Active l'utilisation de la corbeille pour la durée de la session
Quand on supprime une table, celle-ci et tous ses objets dépendants seront donc envoyés vers la « Recyclebin » (index, trigger, contraintes, lobs, partition). Par contre, la suppression d’un index ne l’envoie pas dans la corbeille. Les index ne vont dans la corbeille que lorsqu’ils sont des objets dépendants des tables que l’on supprime.
Pour supprimer une table, ainsi que ses contraintes liées, on rajoutera l’option « CASCADE CONSTRAINTS » comme ceci :
DROP TABLE Article CASCADE CONSTRAINTS;
On peut alors afficher le contenu de la corbeille, via ces 2 possibilités :
SELECT * FROM RECYCLEBIN; -- affiche des objets présents dans la corbeille
SHOW RECYCLEBIN; -- affiche des objets présents dans la corbeille ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME ------------- ------------------------------ ----------- ------------------- SYS_C0014553 BIN$mYTM4IQKomXgUz2zEaxdEw==$0 INDEX 2019-12-12:16:57:20 ARTICLE BIN$mYTM4IQLomXgUz2zEaxdEw==$0 TABLE 2019-12-12:16:57:20
Pour restaurer la table souhaitée (et ses objets liés), il suffit alors de lancer cette commande :
FLASHBACK TABLE Article TO BEFORE DROP;
La suppression de la table est bien « rollbackée » et la contrainte de clé étrangère sur la table « Commande » a bien été ré-affectée.
Pour finir, voici quelques commandes pour « purger » certaines données :
PURGE TABLE Article; -- Suppression de la table et de ses objets liés présents dans la corbeille PURGE RECYCLEBIN; -- Suppression définitive des objets présents dans la corbeille DROP TABLE table_name PURGE; -- Suppression définitive sans passer par la corbeille