データベース行の列を更新すると、バージョン列の値(int)をインクリメントする関数を作成しようとしています。たとえば、列(id、title、version)を持つfooテーブルがあり、デフォルトのバージョンが1の場合、単一のfoo行のタイトルを更新したら、バージョンをインクリメントします。次の関数を記述しましたが、テストするとエラーが発生します。
create or replace function update_foo_version()
returns trigger as $body$
begin
update foo
set version = version::int + 1
where old.id=new.id;
return new;
end
$body$
language plpgsql;
この関数のトリガー:
create trigger update_version
after update on foo
for each row execute procedure update_foo_version();
エラーメッセージのどこに問題があるのかを判断するのは困難ですが、2つのことを推測します。 BEFORE
トリガーが必要ですが、これは機能しません:where old.id=new.id;
あなたが欲しいのは
create or replace function update_foo_version()
returns trigger as $body$
begin
new.version = old.version + 1;
return new;
end
$body$
language plpgsql;
create trigger update_version
BEFORE update on foo
for each row execute procedure update_foo_version();