viernes, 7 de noviembre de 2014

Cómo solucionar el Error SQL: ORA-02292: restricción de integridad


Si alguna vez intentando borrar un registro de una base de datos Oracle y recibes el siguiente error:

Informe de error:
Error SQL: ORA-02292: restricción de integridad (USUARIO_DB.FK_MAN) violada - registro secundario encontrado
02292. 00000 - "integrity constraint (%s.%s) violated - child record found"
*Cause:    attempted to delete a parent key value that had a foreign
           dependency.
*Action:   delete dependencies first then parent or disable constraint.


La solución pasa por encontrar el registro hijo. Para ello puedes lanzar la siguiente consulta:

SELECT OWNER,
       CONSTRAINT_NAME,
       constraint_type,
       TABLE_NAME,
       r_owner,
       r_constraint_name
FROM all_constraints
WHERE OWNER='USUARIO_DB'
AND CONSTRAINT_NAME='FK_MAN';

Con esta consulta sabrás que tabla esta involucrada. Pero para poder saber que columnas son las que se encuentran involucradas, usa la siguiente consulta: 


SELECT ac.owner AS left_owner,
       ac.constraint_name AS left_name,
       ac.table_name AS left_table,
       acc.column_name AS left_column,
       acc.position AS left_position,
       acr.owner AS right_owner,
       acr.constraint_name AS right_name,
       acr.table_name AS right_table,
       accr.column_name AS right_column,
       accr.position AS right_position
FROM all_constraints ac
JOIN all_cons_columns acc ON ac.constraint_name=acc.constraint_name
JOIN all_constraints acr ON ac.r_constraint_name=acr.constraint_name
JOIN all_cons_columns accr ON acr.constraint_name=accr.constraint_name
WHERE ac.owner='USUARIO_DB'  AND ac.constraint_name='FK_MAN';

Ahora ya tienes la información para borrar el contenido de la tabla relacionada:
 "LEFT_TABLE" y LEFT_COLUMN

Ejecuta la sentencia Delete de la relación:

DELETE
FROM LEFT_TABLE
WHERE LEFT_COLUMN= 'ID_RELACIONADO';

Ahora ya puedes borrar el registro de la tabla principal



10 comentarios: