Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara saya secara otomatis mengatur ulang nilai urutan ke 0 setiap tahun di Oracle 10g?

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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dari XML di dalam CLOB, ke tabel Oracle dengan daftar jalur

  2. ingin menampilkan nilai positif dan negatif di kolom yang berbeda melalui satu kueri

  3. Perbarui beberapa baris menggunakan CASE WHEN - ORACLE

  4. Memasukkan tanggal dari Java ke Oracle DB

  5. Oracle Select * mengembalikan baris tetapi Select count(1) mengembalikan 0