ORACLEで一時的にPK、FKを無効にする方法
開発中、一時的に外部キーを無効にしたくなる場合がある。
例えば、大量のデータを流し込むときなど。
そんな場合は下記のようなプロシージャが便利。
無効化するプロシージャ
CREATE OR REPLACE PROCEDURE ENABLE_PK_FK IS CURSOR curPK is select * from USER_CONSTRAINTS where CONSTRAINT_TYPE = 'P'; rowPK curPK%ROWTYPE; CURSOR curFK is select * from USER_CONSTRAINTS where CONSTRAINT_TYPE = 'R'; rowFK curFK%ROWTYPE; sqlAlt varchar2(1000); BEGIN for rowPK in curPK loop sqlAlt := 'alter table ' || rowPK.TABLE_NAME || ' enable constraint ' || rowPK.CONSTRAINT_NAME; execute immediate sqlAlt; end loop; for rowFK in curFK loop sqlAlt := 'alter table ' || rowFK.TABLE_NAME || ' enable constraint ' || rowFK.CONSTRAINT_NAME; execute immediate sqlAlt; end loop; END; /
有効化するプロシージャ
CREATE OR REPLACE PROCEDURE DISABLE_PK_FK IS CURSOR curPK is select * from USER_CONSTRAINTS where CONSTRAINT_TYPE = 'P'; rowPK curPK%ROWTYPE; CURSOR curFK is select * from USER_CONSTRAINTS where CONSTRAINT_TYPE = 'R'; rowFK curFK%ROWTYPE; sqlAlt varchar2(1000); BEGIN for rowFK in curFK loop sqlAlt := 'alter table ' || rowFK.TABLE_NAME || ' disable constraint ' || rowFK.CONSTRAINT_NAME; execute immediate sqlAlt; end loop; for rowPK in curPK loop sqlAlt := 'alter table ' || rowPK.TABLE_NAME || ' disable constraint ' || rowPK.CONSTRAINT_NAME; execute immediate sqlAlt; end loop; END; /