LoginSignup
8
0

More than 5 years have passed since last update.

シーケンスの値を更新したい【DB2】

Last updated at Posted at 2017-05-12

DBのシーケンスの値の更新でかなり苦戦したので、メモしておきます。

シーケンスを作る

とりあえず、こんな感じで作っておきます。


db2 => CREATE OR REPLACE SEQUENCE TEST.SQ_aaaa AS DECIMAL(11) START WITH 1 INCREMENT BY 1 MINVALUE 0 MAXVALUE 99999999999

シーケンス作成した人がシーケンスを更新する場合

例として、次にシーケンスを取得したときに「100」がとれるようにしたいとします。
①と②のどっちがいいかは時と場合によるのかなぁと思います。

① CREATE OR REPLACE で作り直す。


db2 => CREATE OR REPLACE SEQUENCE TEST.SQ_aaaa AS DECIMAL(11) START WITH 100 INCREMENT BY 1 MINVALUE 0 MAXVALUE 99999999999
DB20000I  SQL コマンドが正常に完了しました。
db2 => SELECT SEQNAME, START FROM SYSCAT.SEQUENCES WHERE SEQNAME = 'SQ_AAAA'

SEQNAME                                                                                                                          START
-------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
SQ_AAAA                                                                                                                                                       100.

  1 レコードが選択されました。

db2 => select NEXT VALUE FOR TEST.SQ_aaaa from sysibm.dual

1
-------------
         100.

  1 レコードが選択されました。

これを行うとSTARTの値が変わり、次回にとるシーケンスの値も変わります。

② ALTER文を流す。

(7/10編集:SVC34さんのコメントを参考にNEXTCACHEFIRSTVALUEもSELECT文に入れてみました。)


db2 => ALTER SEQUENCE TEST.SQ_aaaa RESTART WITH 100
DB20000I  SQL コマンドが正常に完了しました。
db2 => SELECT SEQNAME, START, NEXTCACHEFIRSTVALUE FROM SYSCAT.SEQUENCES WHERE SEQNAME = 'SQ_AAAA'

SEQNAME                                                                                                                          START                             NEXTCACHEFIRSTVALUE
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------- ---------------------------------
SQ_AAAA                                                                                                                                                         1.                                1.

  1 レコードが選択されました。

db2 => select NEXT VALUE FOR TEST.SQ_aaaa from sysibm.dual

1
-------------
         100.

  1 レコードが選択されました。

db2 => SELECT SEQNAME, START, NEXTCACHEFIRSTVALUE FROM SYSCAT.SEQUENCES WHERE SEQNAME = 'SQ_AAAA'

SEQNAME                                                                                                                          START                             NEXTCACHEFIRSTVALUE
-------------------------------------------------------------------------------------------------------------------------------- --------------------------------- ---------------------------------
SQ_AAAA                                                                                                                                                         1.                              120.

  1 レコードが選択されました。

①とは違い、STARTの値は変わりませんが、次に取得するシーケンスの値が変わります。

(7/10追記 SVC34さんのコメントより)
ALTER実行直後のNEXTCACHEFIRSTVALUEは一時的にSTARTの値に戻りますが、NEXT VALUEが要求されるとALTERで指定した値(+ CACHE)に変更されます。

シーケンス作った人以外の人がシーケンスの値を変更したい場合

①をやろうとすると・・・


db2 => CREATE OR REPLACE SEQUENCE TEST.SQ_aaaa AS DECIMAL(11) START WITH 100 INCREMENT BY 1 MINVALUE 0 MAXVALUE 99999999999
DB21034E  コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。  SQL 処理中に、次のエラーが返されました。
SQL0551N  許可 ID
に必要な許可がない、または操作を実行する特権がないため、ステートメントが失敗しま
した。許可 ID: "TEST"。操作: "REPLACE SEQUENCE"。オブジェクト:
"TEST.SQ_AAAA"。  SQLSTATE=42501

エラーが発生します。
IBMのホームページを見ながら、「ALTER権限」とか「USAGE権限」とか与えてみましたが、エラーは変わりませんでした。
もし、わかる方がいたら教えていただきたいです。
とりあえず、私の環境で試した限りではうまくいきません。

②をやろうとすると・・・


db2 => ALTER SEQUENCE TEST.SQ_aaaa RESTART WITH 100
DB20000I  SQL コマンドが正常に完了しました。
db2 => select NEXT VALUE FOR TEST.SQ_aaaa from sysibm.dual

1
-------------
         100.

  1 レコードが選択されました。

成功しました。
もし権限系のエラーが出たら、「ALTER権限」を与えればいいかと思います。
今のところ、作成者以外でシーケンスの値を更新するとしたら②しかなさそうな感じです。

感想

②もSTARTの値が変更されるものだと思いこみ、しばらく悩みました。
せっかくだから、投稿してみました。
※スキーマ名とユーザー名は一応実際のものと変えてあります。

8
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0