lundi 7 mars 2011

ORA-02449: unique/primary keys in table referenced by foreign keys

L'erreur ORA-02449 indique simplement que vous tenter de dropper une table qui est référencée par une clé étrangère d'une autre table.

Pour résoudre ce problème il faudrait supprimer ces Foreign Key (FK) avant de dropper la table, mais comment déterminer les tables qui référencent cette Foreign Key ?

La requête suivante peut vous permettre de répondre à cette question:

select * from user_constraints 
where R_CONSTRAINT_NAME in (select CONSTRAINT_NAME from user_constraints where table_name='NOM_TABLE_A_DROPPER') 
and CONSTRAINT_TYPE='R'; 

Le type de contrainte “R” indique qu’il s’agit d’une FK
La colonne R_CONSTRAINT_NAME contient le nom de la Primary Key référencée par la FK.

Voici un petit exemple :
SQL>  CREATE TABLE PAYS
  2      (      id_pays         numeric(10)     not null,
  3             nom_pays        varchar2(50)    not null,
  4             supplier_id     numeric(10)     not null,
  5             CONSTRAINT pays_pk PRIMARY KEY (id_pays)
  6      );

Table created.

SQL> CREATE TABLE CLIENT
  2      (      id_client       numeric(10)     not null,
  3             nom_client      varchar2(50)    not null,
  4             id_pays         numeric(10)     not null,
  5             CONSTRAINT client_pk PRIMARY KEY (id_client),
  6  CONSTRAINT fk_pays
  7               FOREIGN KEY (id_pays)
  8               REFERENCES PAYS(id_pays)
  9      );

Table created.

Si j’essaie de dropper la table PAYS je tombe sur l’erreur ORA-02449 :
SQL> drop table pays;
drop table pays
           *
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys


La requête suivante m’indique le nom de la foreign key à dropper pour pouvoir dropper ma table :
SQL> select table_name,CONSTRAINT_NAME from user_constraints
  2  where R_CONSTRAINT_NAME in (select CONSTRAINT_NAME from user_constraints where table_name='PAYS')
  3  and CONSTRAINT_TYPE='R';

TABLE_NAME                     CONSTRAINT_NAME
------------------------------ ------------------------------
CLIENT                         FK_PAYS

La FK étant identifié je peux la dropper puis dropper ma table :

SQL> alter table CLIENT drop constraint FK_PAYS;

Table altered.

SQL> drop table pays;

Table dropped.


Si on veut vraiment supprimer la table sans se soucier des éventuels FK, on peut utiliser la clause CASCADE CONSTRAINTS de la commande DROP TABLE. Cette clause indique à Oracle de supprimer automatiquement toutes les FK qui référenceraient la table à dropper :
SQL> drop table pays cascade constraints;

Table dropped.

Aucun commentaire:

Enregistrer un commentaire