CREATE OR REPLACE TRIGGER – PostgreSQL 14でコミットされた機能の先行紹介:技術者Blog
PostgreSQLインサイド

大墨 昂道

富士通株式会社
ソフトウェアプロダクト事業本部 データマネジメント事業部

はじめに

富士通のシニアディレクターであるAmit Kapilaが率いる"グローバルPostgreSQL開発チーム"は、当社のPostgreSQLに対する取り組みの一環として、コミュニティーへ継続的な貢献を行っています。私はこのチームの一員として、世界中の才能ある情熱的なコミュニティーメンバーとともに、PostgreSQLの発展に積極的に取り組んでいます。
私たちのチームは、メンバーが取り組んだ機能やパッチに焦点を当て、ブログ記事を発信していきます。この記事では、PostgreSQL 14にコミットされたCREATE OR REPLACE TRIGGERの機能について述べ、この機能を提案した理由とコミュニティーでの議論を通じてコードがどのように改善されたかを説明します。

背景

大墨
トリガーは関連するイベントが発生した時に指定した関数を実行します。PostgreSQL 13では、トリガーを定義するCREATE TRIGGERコマンドに、OR REPLACE句をサポートしていませんでした。
一方、FUJITSU Software Enterprise Postgresでは、9.5(2016年リリース)からOR REPLACE句とともにDO句をサポートし提供しています。私は、このOR REPLACE句が、OracleからPostgreSQLへの移行に役立つという観点から、コミュニティーで実装することを提案しました。結果的に、この提案は受け入れられ、パッチは2020年11月にコミットされました。

コミュニティーにこの機能を提案した主な動機は、富士通のお客様からのご要望によりOracleからPostgreSQLへの移行を簡単にすることでした。データベース間で非互換がある場合、その非互換を補うためにアプリケーションを書き換えるコストが生じ、移行の障壁となります。PostgreSQLが機能を拡張し、他の仕様を持つデータベースと互換性のある機能を提供するようになると、より多くのユーザーがPostgreSQLを採用して移行する可能性が高くなり、結果的にPostgreSQLの人気が高まります。CREATE OR REPLACE TRIGGERをコミットすることは、この流れを進める活動の1つと考えることができます。
コミュニティーでは、こうしたOracleとの互換部分を拡張していくという議論は、時折実施されますが、私たちのチームはこのプロジェクトをコミットすることで、この動きを後押ししました。

機能概要 - CREATE OR REPLACE TRIGGERとは?

大墨
CREATE TRIGGERは単に新しいトリガーを作成するだけですが、CREATE OR REPLACE TRIGGERは新しいトリガーを作成したり、既存のトリガーを上書きしたりすることができます。同じ名前のトリガーがすでに存在する場合に、CREATE TRIGGERを単純に実行するとエラーが発生します。CREATE OR REPLACE TRIGGERの利点は、新しいトリガーを作成し、既存のトリガーを単一の文で置き換えることができる点です。これにより、Oracleデータベースから移行するときに2つのコマンドを別々に記述する手間が省けます。この結果、アプリケーションの移行作業が軽減されます。さらに、新しいシステムを構築する場合には、SQL式が単純化されるため、ユーザーはより少ない時間と労力で結果を得ることができます。

PostgreSQL 13でトリガーを更新するサンプル PostgreSQL 14でトリガーを更新するサンプル
BEGIN;
CREATE TRIGGER trg1 BEFORE INSERT OR UPDATE ON my_table FOR EACH ROW EXECUTE PROCEDURE funcA();
(その他の処理)
DROP TRIGGER trg1 ON my_table;
CREATE TRIGGER trg1 BEFORE INSERT ON my_table FOR EACH ROW EXECUTE PROCEDURE funcB();
END;
BEGIN;
CREATE TRIGGER trg1 BEFORE INSERT OR UPDATE ON my_table FOR EACH ROW EXECUTE PROCEDURE funcA();
(その他の処理)
CREATE OR REPLACE TRIGGER trg1 BEFORE INSERT ON my_table FOR EACH ROW EXECUTE PROCEDURE funcB();
END;

トリガーは一般にアプリケーションで広く使用されているため、この機能はあらゆる業種のユーザーにメリットをもたらします。CREATE OR REPLACE TRIGGERは、アプリケーションのビジネスロジックが頻繁に更新される場合に特に有効です。

開発の舞台裏

大墨
このプロジェクトで、私はFujitsu Australia Software Technology(以降、FASTと略します)のPostgreSQL開発チームのメンバーと共同開発する機会を得ました。今回、ドキュメントやソースコードの品質向上から網羅的なテスト項目作成に至るまで、FASTメンバーからの全面的な協力がコミュニティーの中でありました。これにより、この機能をコミュニティーのコードにコミットするまでの時間を大幅に短縮できました。このプロジェクトを成功裏に完了させるために、FASTの貢献は極めて重要でした。
またこれは私にとって、PostgreSQLのコミュニティーへ提供したコードがコミットされた、初めての体験だったので、PostgreSQLの世界に貢献できる自信と実感を得ることができました。私がコミュニティー活動に参加する動機は、そこで開発された機能が世界中のPostgreSQLユーザーに利用可能になることです。私が構想して書いたコードが、世界中の人に使ってもらえるように埋め込まれているのを見ると、とても嬉しく思います。今回コミットされたコードの中では特に、パーティション・テーブルのトリガーにおいても、OR REPLACE句によって上手くトリガーが置換されるのを見て、そう感じました。パーティション・テーブルのトリガーの置換は、内部的に複雑であることと、多くの条件分岐パターンを十分に考慮しなければならないため、非常に困難だったからです。最適な設計を完成させるのは大変でしたが、コミュニティーからのアドバイスもあり、実現できて本当に良かったです。

トリガー関連機能の今後の展望

大墨
これまで富士通は、OR REPLACE句を追加することと同時に、DO句のサポートもコミュニティーに提案してきました。DO句を使用すると、アプリケーション開発者は一時的な関数を使用してトリガーを定義でき、アプリケーションに柔軟性を持たせることができます。つまり、DO句を定義することで、アプリケーションは特定のケースに対して例外的な処理を簡単に実行できます。しかし、コミュニティーはこうした構文の変更を段階的に実装することを希望しました。
そこで富士通は、まずDO句は一旦提案から外し、OR REPLACEのみで提案を進めました。粘り強い提案と議論が功を奏し、PostgreSQL 14のCommitfest(注1)で受け入れられました。将来的には、CREATE OR REPLACE TRIGGER機能をさらに拡張するために、次にDO句を有効にすることが役立つでしょう。上記で説明したアプリケーションに対する柔軟性は、ユーザーに価値をもたらすに違いありません。

  • 注1
    Commitfestとは、集中的にパッチのレビューを行い、新機能として承認(コミット)するかどうかを判断する期間およびそのプロセスのことです。基本的には2カ月に1回開催されます。

今後のブログ記事で、PostgreSQLコミュニティーでの私たちの様々なプロジェクトについて、最新情報を共有できることを楽しみにしています。

2021年2月26日公開

オンデマンド(動画)セミナー

    • PostgreSQLに関連するセミナー動画を公開中。いつでもセミナーをご覧いただけます。
      • 【事例解説】運送業務改革をもたらす次世代の運送業界向けDXプラットフォームの構築
      • ハイブリッドクラウドに最適なOSSベースのデータベースご紹介

本コンテンツに関するお問い合わせ

お電話でのお問い合わせ

Webでのお問い合わせ

当社はセキュリティ保護の観点からSSL技術を使用しております。

ページの先頭へ