Các chuỗi không thực sự được thiết kế để đặt lại. Nhưng có một số trường hợp mong muốn đặt lại trình tự, ví dụ:khi thiết lập dữ liệu thử nghiệm hoặc hợp nhất dữ liệu sản xuất trở lại môi trường thử nghiệm. Loại hoạt động này không thường được thực hiện trong sản xuất.
NẾU loại hoạt động này được đưa vào sản xuất, nó cần phải được kiểm tra kỹ lưỡng. (Điều gây ra mối quan tâm nhất là khả năng quy trình đặt lại vô tình được thực hiện sai thời điểm, chẳng hạn như vào giữa năm.
Loại bỏ và tạo lại trình tự là một trong những cách tiếp cận. Là một hoạt động, nó khá đơn giản theo như SEQUENCE:
DROP SEQUENCE MY_SEQ; CREATE SEQUENCE MY_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 0;
[EDIT] Như Matthew Watson đã chỉ ra một cách chính xác, mọi câu lệnh DDL (chẳng hạn như DROP, CREATE, ALTER) sẽ gây ra một cam kết ngầm. [/ CHỈNH SỬA]
Tuy nhiên, bất kỳ đặc quyền nào được cấp trên SEQUENCE sẽ bị loại bỏ, vì vậy những đặc quyền đó sẽ cần được cấp lại. Bất kỳ đối tượng nào tham chiếu đến chuỗi sẽ bị vô hiệu. Để có được điều này tổng quát hơn, bạn cần lưu các đặc quyền (trước khi bỏ trình tự) và sau đó cấp lại chúng.
Cách tiếp cận thứ hai là ALTER một SEQUENCE hiện có, mà không bỏ và tạo lại nó. Việc đặt lại trình tự có thể được thực hiện bằng cách thay đổi giá trị INCREMENT thành giá trị âm (chênh lệch giữa giá trị hiện tại và 0), sau đó thực hiện chính xác một .NEXTVAL để đặt giá trị hiện tại thành 0, sau đó thay đổi INCREMENT trở lại 1. Trước đây, tôi đã sử dụng phương pháp tương tự này (theo cách thủ công, trong môi trường thử nghiệm), để đặt chuỗi thành giá trị lớn hơn.
Tất nhiên, để điều này hoạt động chính xác, bạn cần đảm bảo không có phiên nào khác tham chiếu trình tự trong khi thao tác này đang được thực hiện. Một .NEXTVAL bổ sung vào sai thời điểm sẽ làm hỏng việc thiết lập lại. (LƯU Ý:việc đạt được điều đó ở phía cơ sở dữ liệu sẽ khó, nếu ứng dụng đang kết nối với tư cách là chủ sở hữu của chuỗi, thay vì với tư cách là một người dùng riêng biệt.)
Để nó diễn ra hàng năm, bạn cần phải lên lịch cho một công việc. Việc đặt lại trình tự sẽ phải được phối hợp với việc đặt lại phần YYYY trong số nhận dạng của bạn.
Đây là một ví dụ:
http://www.jaredstill.com/content/reset-sequence.html
[CHỈNH SỬA]
CHƯA ĐƯỢC THỬ NGHIỆM trình giữ chỗ cho một thiết kế có thể có của khối PL / SQL để đặt lại trình tự
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; /
LƯU Ý:
- cách bảo vệ tốt nhất trình tự khỏi quyền truy cập trong khi nó đang được đặt lại, HÃY ĐỔI MỚI nó?
- Một số trường hợp thử nghiệm để hoạt động tại đây.
- Đầu tiên, hãy kiểm tra các trường hợp quy chuẩn của dãy số dương, số tăng dần, số gia tăng 1.
- sẽ có cách tiếp cận tốt hơn là tạo SEQUENCE mới, thêm quyền, đổi tên các chuỗi hiện có và chuỗi mới, sau đó biên dịch lại các phần phụ thuộc?