Urutan tidak benar-benar dirancang untuk diatur ulang. Tetapi ada beberapa kasus di mana pengaturan ulang urutan diinginkan, misalnya, saat menyiapkan data pengujian, atau menggabungkan data produksi kembali ke lingkungan pengujian. Jenis aktivitas ini tidak biasanya dilakukan dalam produksi.
JIKA jenis operasi ini akan dimasukkan ke dalam produksi, perlu diuji secara menyeluruh. (Yang paling mengkhawatirkan adalah potensi prosedur reset yang tidak sengaja dilakukan pada waktu yang salah, seperti, di tengah tahun.
Menjatuhkan dan membuat ulang urutan adalah salah satu pendekatan. Sebagai operasi, ini cukup mudah sejauh SEQUENCE berjalan:
DROP SEQUENCE MY_SEQ; CREATE SEQUENCE MY_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 0;
[EDIT] Seperti yang ditunjukkan oleh Matthew Watson dengan benar, setiap pernyataan DDL (seperti DROP, CREATE, ALTER) akan menyebabkan komit implisit. [/EDIT]
Namun, hak istimewa apa pun yang diberikan pada SEQUENCE akan dihapus, sehingga hak tersebut perlu diberikan kembali. Objek apa pun yang mereferensikan urutan akan dibatalkan. Untuk membuatnya lebih umum, Anda perlu menyimpan hak istimewa (sebelum menghapus urutannya) dan kemudian memberikannya kembali.
Pendekatan kedua adalah MENGUBAH SEQUENCE yang ada, tanpa menjatuhkan dan membuatnya kembali. Menyetel ulang urutan dapat dilakukan dengan mengubah nilai INCREMENT ke nilai negatif (selisih antara nilai saat ini dan 0), lalu lakukan tepat satu .NEXTVAL untuk menyetel nilai saat ini ke 0, lalu ubah INCREMENT kembali ke 1. Saya telah menggunakan pendekatan yang sama sebelumnya (secara manual, dalam lingkungan pengujian), untuk menyetel urutan ke nilai yang lebih besar juga.
Tentu saja, agar ini berfungsi dengan benar, Anda perlu mengasuransikan tidak ada sesi lain yang merujuk urutan saat operasi ini dilakukan. Tambahan .NEXTVAL pada saat yang salah akan mengacaukan reset. (CATATAN:mencapai itu di sisi database akan sulit, jika aplikasi terhubung sebagai pemilik urutan, bukan sebagai pengguna terpisah.)
Untuk mewujudkannya setiap tahun, Anda perlu menjadwalkan pekerjaan. Pengaturan ulang urutan harus dikoordinasikan dengan pengaturan ulang bagian YYYY dari pengidentifikasi Anda.
Ini contohnya:
http://www.jaredstill.com/content/reset-sequence.html
[EDIT]
TIDAK TERUJI placeholder untuk satu kemungkinan desain blok PL/SQL untuk mengatur ulang urutan
declare pragma autonomous_transaction; ln_increment number; ln_curr_val number; ln_reset_increment number; ln_reset_val number; begin -- save the current INCREMENT value for the sequence select increment_by into ln_increment from user_sequences where sequence_name = 'MY_SEQ'; -- determine the increment value required to reset the sequence -- from the next fetched value to 0 select -1 - MY_SEQ.nextval into ln_reset_increment from dual; -- fetch the next value (to make it the current value) select MY_SEQ.nextval into ln_curr from dual; -- change the increment value of the sequence to EXECUTE IMMEDIATE 'alter sequence MY_SEQ increment by ' || ln_reset_increment ||' minvalue 0'; -- advance the sequence to set it to 0 select MY_SEQ.nextval into ln_reset_val from dual; -- set increment back to the previous(ly saved) value EXECUTE IMMEDIATE 'alter sequence MY_SEQ increment by ' || ln_increment ; end; /
CATATAN:
- bagaimana cara terbaik melindungi urutan dari akses saat sedang disetel ulang, GANTI NAMAnya?
- Beberapa kasus uji untuk diselesaikan di sini.
- Lulusan pertama, periksa kasus normatif dari urutan positif, menaik, kenaikan 1.
- apakah pendekatan yang lebih baik adalah membuat SEQUENCE baru, menambahkan izin, mengganti nama urutan yang ada dan baru, lalu mengkompilasi ulang dependensi?