Bagaimana cara menonaktifkan semua batasan tabel di Oracle dengan satu perintah? Ini bisa untuk satu tabel, daftar tabel, atau untuk semua tabel.
96
Lebih baik hindari menulis file spool sementara. Gunakan blok PL / SQL. Anda dapat menjalankan ini dari SQL * Plus atau memasukkannya ke dalam paket atau prosedur. Gabungan ke USER_TABLES dilakukan untuk menghindari batasan tampilan.
Tidak mungkin Anda benar-benar ingin menonaktifkan semua batasan (termasuk NOT NULL, kunci primer, dll). Anda harus berpikir untuk meletakkan constraint_type di klausa 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;
/
Mengaktifkan batasan lagi sedikit lebih rumit - Anda perlu mengaktifkan batasan kunci utama sebelum Anda dapat mereferensikannya dalam batasan kunci asing. Ini dapat dilakukan menggunakan ORDER BY pada constraint_type. 'P' = kunci primer, 'R' = kunci asing.
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;
/
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
ke segmen kode pertama.Untuk memperhitungkan dependensi antara batasan:
sumber
Ini bukan perintah tunggal, tapi begini cara saya melakukannya. Skrip berikut telah dirancang untuk berjalan di SQL * Plus. Catatan, saya sengaja menulis ini hanya untuk bekerja dalam skema saat ini.
Untuk membatasi apa yang Anda lepaskan, filter tambahkan klausa where ke pernyataan pilih: -
Untuk berjalan di lebih dari skema saat ini, ubah pernyataan pilih untuk memilih dari all_constraints daripada user_constraints.
Catatan - untuk beberapa alasan saya tidak bisa membuat garis bawah TIDAK bertindak seperti huruf miring di paragraf sebelumnya. Jika seseorang tahu cara memperbaikinya, silakan edit jawaban ini.
sumber
Gunakan kursor berikut untuk menonaktifkan semua kendala .. Dan mengubah kueri untuk mengaktifkan kendala ...
sumber
Ini dapat ditulis dalam PL / SQL cukup sederhana berdasarkan tampilan sistem DBA / ALL / USER_CONSTRAINTS, tetapi berbagai detail membuatnya tidak sepele kedengarannya. Anda harus berhati-hati tentang urutan pelaksanaannya dan Anda juga harus memperhitungkan keberadaan indeks unik.
Urutan ini penting karena Anda tidak dapat menjatuhkan kunci unik atau primer yang direferensikan oleh kunci asing, dan mungkin ada kunci asing pada tabel di skema lain yang mereferensikan kunci primer di Anda sendiri, jadi kecuali Anda memiliki hak istimewa ALTER ANY TABLE maka Anda tidak bisa menjatuhkan PK dan UK itu. Anda juga tidak dapat mengubah indeks unik menjadi indeks non-unik sehingga Anda harus melepaskannya untuk menghilangkan batasan (karena alasan ini, hampir selalu lebih baik untuk menerapkan batasan unik sebagai batasan "nyata" yang didukung oleh non -indeks unik).
sumber
Sepertinya Anda tidak dapat melakukan ini dengan satu perintah, tetapi inilah hal terdekat yang dapat saya temukan.
sumber
Ini adalah cara lain untuk menonaktifkan kendala (berasal dari https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132:::::P11_QUESTION_ID:399218963817 )
bekerja seperti pesona
sumber
Dalam skrip "nonaktifkan", urutan menurut klausa harus seperti ini:
Tujuan dari klausa ini adalah menonaktifkan batasan dalam urutan yang benar.
sumber
Pernyataan ini mengembalikan perintah yang mematikan semua batasan termasuk kunci utama, kunci asing, dan batasan lain.
sumber
dengan kursor untuk loop (user = 'TRANEE', table = 'D')
(Jika Anda mengubah nonaktifkan untuk mengaktifkan, Anda dapat mengaktifkan semua batasan)
sumber
Anda dapat menjalankan semua perintah yang dikembalikan oleh kueri berikut:
pilih 'ALTER TABLE' || substr (c.table_name, 1,35) || 'DISABLE CONSTRAINT' || constraint_name || ' ; ' dari user_constraints c --dimana c.table_name = 'TABLE_NAME';
sumber