Tôi cần thực hiện một loạt các câu lệnh sql (lên đến ~ 1000000) trên cơ sở dữ liệu Oracle. Các câu lệnh này sẽ dẫn đến trạng thái nhất quán tham chiếu ở cuối và tất cả các câu lệnh sẽ được cuộn lại nếu xảy ra lỗi. Những phát biểu này không có thứ tự tham chiếu. Vì vậy, nếu các ràng buộc khoá ngoại được kích hoạt, một trong những phát biểu có thể gây ra một sự vi phạm chính ở nước ngoài mặc dù, vi phạm này sẽ được sửa với một tuyên bố sẽ được thực thi sau này.Oracle DDL trong giao dịch tự động
Trước tiên, tôi đã thử vô hiệu hóa khóa ngoại và bật chúng sau khi tất cả các câu lệnh được thực thi. Tôi nghĩ rằng tôi sẽ có thể quay trở lại khi có một sự vi phạm chính ở nước ngoài thực sự. Mặc dù vậy, tôi đã sai, tôi phát hiện ra rằng mọi câu lệnh DDL trong Oracle đều bắt đầu bằng một cam kết, vì vậy không có cách nào để khôi phục các câu lệnh theo cách này. Đây là kịch bản của tôi để vô hiệu hóa các khóa ngoại:
begin
for i in (select constraint_name, table_name from user_constraints
where constraint_type ='R' and status = 'ENABLED')
LOOP execute immediate 'alter table '||i.table_name||' disable constraint
'||i.constraint_name||'';
end loop;
end;
Sau khi nghiên cứu, tôi đã đề xuất thực thi các câu lệnh DDL, như trong trường hợp này, trong giao dịch tự quản. Vì vậy, tôi đã cố gắng chạy các câu lệnh DDL trong một giao dịch tự quản. Điều này dẫn đến các lỗi sau:
ORA-00.054: tài nguyên bận rộn và có được với NOWAIT định
Tôi đoán đây là do giao dịch chính vẫn khóa DDL trên bảng.
Tôi có làm gì sai ở đây không, hoặc có cách nào khác để làm cho kịch bản này hoạt động không?
Tôi vừa phát hiện ra mẹo "SET CONSTRAINTS" và đến đây để trả lời câu hỏi của riêng tôi và tôi đã thấy câu trả lời của bạn :). Cảm ơn bạn. – swamplord