2012-03-26
tuplock extension
しばらく本業その他にかまけていてPostgreSQL関連のwatchをなんにもしてなかった・・・。
で、一週間くらい前にANNOUNCEのMLに流れていたんだけど、tuplockなるextensionがあるらしい。
tuplockとは?
ざっと斜め読みした感じでは、ロック用のタプルをテーブル定義時に入れて、そのタプルの値を一旦TRUEにすると、以降、その行への更新/削除を行おうとするときにトリガ内でエラーにしてくれるものっぽい。
所謂排他制御的なロックというよりも、行単位でのレコードの値を固定するもの、という感じか。
とはいえ、どういう時に使える代物なのかな・・・。
- 挿入は許容するけど、以降の更新を許容しない。例えば監査ログを書きこんでおき、その監査ログへの参照は許容するけど、更新を許容しないとか?
- でも、そのケースならGRANTで普通に制御出来そうな気もするしなあ・・・。
- トリガを削除しちゃえばノーガードにされちゃうし・・・。
この用途としてはGRANT/REVOKEだとテーブル単位の制御になってしまうのを、タプル単位かつ、ユーザが指定するあるタイミングから行単位で更新/削除を抑止するというところにあるのだろう。
動かしてみる
まあいい。とりあえずインストールしてみよう。
zipになっているのでWindows上で解凍してからWinSCPでPostgreSQL実験用サーバへ送り、contrib上に置いてmakeしてmake installする。ここまでは問題なし。
で、テスト用のデータベースにCREATE EXTENSIONで突っ込もうとすると
$ psql -p 5434 test -U harada -c "CREATE EXTENSION tuplock"
ERROR: syntax error at or near "\"
LINE 1: CREATE EXTENSION tuplock
^
なんぞこれw
強引にinstallスクリプトを実行しようとすると
$ psql -p 5434 test -U harada -f ~/pgsql/share/extension/tuplock--1.1.1.sql怒られちゃうしなあ・・・
Use "CREATE EXTENSION tuplock" to load this file.
$
CREATE EXTENSIONで怒られる原因は後で調べるとして、とりあえず直接インストールスクリプトをぶっこんでみる。
$ psql -p 5434 test -U harada -f ~/pgsql/share/extension/tuplock.sql
LOAD
CREATE FUNCTION
$
一応、動作はするようになったと思うが、psqlの\xコマンドで表示されるパッケージ一覧には表示されない。やはりこの方法はおすすめは出来ないのだろうなあ。
まあいい。とりあえずREADMEに従ってテーブルを作ってみよう。
test=> CREATE TABLE hoge (id int, data text, lock BOOLEAN NOT NULL DEFAULT FALSE);
CREATE TABLE
test=> \d hoge
Table "public.hoge"
Column | Type | Modifiers
--------+---------+------------------------
id | integer |
data | text |
lock | boolean | not null default false
test=>
で、トリガを設定。トリガ設定をさせるあたりがイケてない。
test=> CREATE TRIGGER hoge_tuplock BEFORE UPDATE OR DELETE ON hoge FOR EACH ROW EXECUTE PROCEDURE tuplock(lock);
CREATE TRIGGER
データを突っ込む。
test=> INSERT INTO hoge VALUES (1, 'AAA');
INSERT 0 1
test=> INSERT INTO hoge VALUES (2, 'BBB');
INSERT 0 1
test=>
ここまではどうということもない。で、id=1の行のlock列をTRUEに変更(今更だが、列名にlockというSQLキーワードをつけちゃたのはあまりよろしくないなあ・・・)。
test=> UPDATE hoge SET lock = TRUE WHERE id = 1;
UPDATE 1
test=>
で以降、id=1のタプルを変更しようとしたり、削除しようとしたりするとエラーになるというわけだ。
test=> UPDATE hoge SET data='ZZZ' WHERE id = 1;
ERROR: trigger "hoge_tuplock" on "hoge": item locked by attribute "lock"
test=> DELETE FROM hoge WHERE id = 1;
ERROR: trigger "hoge_tuplock" on "hoge": item locked by attribute "lock"
test=> DELETE FROM hoge ;
ERROR: trigger "hoge_tuplock" on "hoge": item locked by attribute "lock"
test=> TRUNCATE TABLE hoge ;
TRUNCATE TABLE
test=>
TRUNCATEトリガはセットしていないのでTRUNCATEされちまった。当たり前だw
まとめ
ちょっと面白い拡張ではあるけど、使い所はちょっと難しそうだなあ・・・。
トラックバック - http://d.hatena.ne.jp/nuko_yokohama/20120326/1332745100
リンク元
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CD0QFjAB&url=http://d.hatena.ne.jp/nuko_yokohama/20111227/1324977691&ctbs=lr:lang_1ja&ei=VB1xT6D-JuzTmAXM3Jm5Dw&usg=AFQjCNHKPn521ycdJWw-vJjlEz17-1p-Aw&sig2=ZvIPZjpU7msuYAX
- 3 http://newgle.mahata.net/
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCgQFjAA&url=http://d.hatena.ne.jp/nuko_yokohama/20111226/1324877286&ei=7GJ9T-uNAdHIrQeiy9zuDA&usg=AFQjCNEyQ8EQSVCqm7_2G0nwhM-1x0Ip3Q&sig2=Dli670O-FHUQLIExeGCPdA
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CEgQFjAD&url=http://d.hatena.ne.jp/nuko_yokohama/20111224/1324711531&ei=xUh5T6K7LYmDmQWw-OjpDw&usg=AFQjCNGBiowkdWgL87UZsS_xt6SvA0I-QQ
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=unlogged?????若?????&source=web&cd=2&ved=0CEgQFjAB&url=http://d.hatena.ne.jp/nuko_yokohama/20111212/1323662429&ei=yTl5T9z9DOjimAXzvK3pDw&usg=AFQjCNFMibEtxp29qkPapPkZdUtQzzudNg&ca
- 3 https://www.google.co.jp/
- 2 http://ezsch.ezweb.ne.jp/search/?sr=0101&query=URL形式
- 2 http://www.google.co.jp/
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=2&ved=0CD8QFjAB&url=http://d.hatena.ne.jp/nuko_yokohama/20120119/1326952206&ei=wP11T9n5OqbWmAWJoNDpDw&usg=AFQjCNHr4Or118tzNBZQfzTZ0mt04i9QfQ&sig2=OC7cYDNik8KRpyDvMzuCSw
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CFcQFjAF&url=http://d.hatena.ne.jp/nuko_yokohama/20120112/1326357174&ei=xYODT6KTF6bPmAWq-O3WBw&usg=AFQjCNGIcCi4kYWHJ9WgqiArluEsSWUSPQ&sig2=CSh49BuIY4SCkwv4PfKzFA
