Friday, June 19, 2009

How to disable reference constraint(s) for particular table(s)

Anonymous PL/SQL block for single table:

declare
alter_tbl varchar2(4000) := '';
begin
SELECT 'ALTER TABLE '||table_name||' DISABLE CONSTRAINT '||constraint_name INTO alter_tbl FROM user_constraints WHERE r_constraint_name IN (SELECT constraint_name FROM user_constraints WHERE table_name='TABLE_NAME' AND constraint_type <> 'R') AND status = 'ENABLED';
--dbms_output.put_line(alter_tbl);
execute immediate alter_tbl;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
dbms_output.put_line('Table does not have any (enabled) reference constraints!');
end;
/

And for two (or more) tables:

declare
cnt number;
begin
SELECT count(table_name) INTO cnt FROM user_constraints WHERE r_constraint_name IN (SELECT constraint_name FROM user_constraints WHERE table_name IN ('1_TABLE_NAME', '2_TABLE_NAME') AND constraint_type <> 'R') AND status = 'ENABLED';
IF cnt = 0 THEN
dbms_output.put_line('Table does not have any (enabled) reference constraints!');
ELSE
FOR alter_tbl IN (
SELECT 'ALTER TABLE '||table_name||' DISABLE CONSTRAINT '||constraint_name AS tbl FROM user_constraints WHERE r_constraint_name IN (SELECT constraint_name FROM user_constraints WHERE table_name IN ('1_TABLE_NAME', '2_TABLE_NAME') AND constraint_type <> 'R') AND status = 'ENABLED'
) LOOP
-- dbms_output.put_line(alter_tbl.tbl);
execute immediate alter_tbl.tbl;
END LOOP;
END IF;
END;
/