Now you want to switch them with ON DELETE CASCADE.
This situation could happen for example because your tables are created through JPA or something like that. Here is the solution.
After a lot of search, the only way I found is to delete and recreate all foreign keys in order to specify On Delete Cascade option.
And there is also no way with Java Persistence Api (JPA) to create ManyToOne relations with the delete cascade option.
So, here is a script I found in the web and modified just a little, that drops all foreign keys and recreates them with the "on delete cascade" option.
You have to copy all the text generated from the DBMS Output and execute it manually as script (after cheking it carefully for security),
DECLARE
textadd clob;
CURSOR consCols (theCons VARCHAR2, theOwner VARCHAR2) IS
select * from user_cons_columns
where constraint_name = theCons and owner = theOwner
order by position;
firstCol BOOLEAN := TRUE;
begin
textadd := '';
-- For each constraint
FOR cons IN (select * from user_constraints
where delete_rule = 'NO ACTION'
and constraint_name not like '%MODIFIED_BY_FK' -- these constraints we do not want delete cascade
and constraint_name not like '%CREATED_BY_FK'
order by table_name)
LOOP
-- Drop the constraint
DBMS_OUTPUT.PUT_LINE( 'ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' DROP CONSTRAINT ' || cons.CONSTRAINT_NAME || ';');
-- Re-create the constraint
textadd := textadd || 'ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' ADD CONSTRAINT ' || cons.CONSTRAINT_NAME || ' FOREIGN KEY (';
firstCol := TRUE;
-- For each referencing column
FOR consCol IN consCols(cons.CONSTRAINT_NAME , cons .OWNER )
LOOP
IF(firstCol) THEN
firstCol := FALSE;
ELSE
textadd := textadd || ',';
END IF;
textadd := textadd || consCol .COLUMN_NAME ;
END LOOP;
textadd := textadd || ') REFERENCES ';
firstCol := TRUE;
-- For each referenced column
FOR consCol IN consCols(cons.R_CONSTRAINT_NAME , cons.R_OWNER)
LOOP
IF(firstCol) THEN
textadd := textadd || consCol .OWNER || '.' || consCol.TABLE_NAME || ' (' ;
firstCol := FALSE;
ELSE
textadd := textadd || ',';
END IF;
textadd := textadd || consCol .COLUMN_NAME ;
END LOOP;
textadd := textadd || ') ON DELETE CASCADE ENABLE VALIDATE;';
END LOOP;
DBMS_OUTPUT.PUT_LINE( '-- ----------------------- --' );
DBMS_OUTPUT.PUT_LINE( '-- FOREIGN KEYS CREATION --' );
DBMS_OUTPUT.PUT_LINE( '-- ----------------------- --' );
DBMS_OUTPUT.PUT_LINE( textadd);
end;

No comments:
Post a Comment