【Supabase】データ変更時に「更新日時」を自動更新する処理を作る

2024/03/19に公開

特定テーブルのデータを更新したら、そレコードの更新日時カラムupdated_atを自動更新する処理が必要な場面がよくあります。

SupabaseのFunction機能を使ってこの処理を作成したメモです。

データ変更で「更新日時」を自動更新する処理

1) 「更新日時を更新する関数」を作成する

-- updated_atカラムを更新する関数作成
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.modified_at = timezone('Asia/Tokyo', now());
    RETURN NEW;
END;
$$ language 'plpgsql';

2) トリガーを設定する(データの変更があった時に関数実行)

-- postテーブル用のトリガーの設定
CREATE TRIGGER update_post_modtime
BEFORE UPDATE ON post
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();

特定カラムの変更を除外したい場合

users28dayというカラムの更新時は更新日時の自動更新をしない、という例外処理です。

-- 特定カラムを変更した時は除外する
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
    -- users28dayが更新されていない場合にのみupdated_atを更新
    IF OLD.users28day IS DISTINCT FROM NEW.users28day THEN
        RETURN NEW;
    ELSE
        NEW.modified_at = timezone('Asia/Tokyo', now());
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Discussion