Tốt hơn là tránh ghi ra các tệp ống đệm tạm thời. Sử dụng một khối PL / SQL. Bạn có thể chạy điều này từ SQL * Plus hoặc đưa thứ này vào một gói hoặc thủ tục. Việc tham gia USER_TABLES là có để tránh các hạn chế về chế độ xem.
Không chắc rằng bạn thực sự muốn vô hiệu hóa tất cả các ràng buộc (bao gồm NOT NULL, khóa chính, v.v.). Bạn nên nghĩ đến việc đặt bind_type trong mệnh đề WHERE.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'ENABLED'
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
ORDER BY c.constraint_type DESC)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
END LOOP;
END;
/
Việc kích hoạt lại các ràng buộc khó hơn một chút - bạn cần phải kích hoạt các ràng buộc khóa chính trước khi có thể tham chiếu chúng trong một ràng buộc khóa ngoại. Điều này có thể được thực hiện bằng cách sử dụng ORDER BY trên bind_type. 'P' =khóa chính, 'R' =khóa ngoài.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'DISABLED'
ORDER BY c.constraint_type)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
END LOOP;
END;
/