Suppression BDD avec la corbeille Oracle Recyclebin

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