Home
>
Supabase Date Protection Trigger Functions

Supabase Date Protection Trigger Functions

3 min read
Jonathan Gamble

jdgamble555 on Sunday, October 16, 2022 (last modified on Sunday, December 17, 2023)

While you can create a default date value with now(), sometimes you don't want the user to be able to override that date. You also may want to have automatic updated_at date values.

First, create these functions which can be used on any table:

Reusable Procedures

	-- PROCEDURES for created_at and updated_at
CREATE OR REPLACE FUNCTION update_dates()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = now();
    NEW.created_at = OLD.created_at;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

CREATE OR REPLACE FUNCTION insert_dates()
RETURNS TRIGGER AS $$
BEGIN
    NEW.created_at = now();
    NEW.updated_at = NULL;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

Next, create the function triggers for the specific tables you want to protect your dates with:

Functions for Table X

	DROP TRIGGER IF EXISTS profiles_update_dates
  ON profiles;
CREATE TRIGGER profiles_update_dates
BEFORE UPDATE ON profiles
FOR EACH ROW EXECUTE PROCEDURE update_dates();

DROP TRIGGER IF EXISTS profiles_insert_dates
  ON profiles;
CREATE TRIGGER profiles_insert_dates
BEFORE INSERT ON profiles
FOR EACH ROW EXECUTE PROCEDURE insert_dates();

And you can just create new functions for every Table X, reusing the procedures above.

For the full thought process on this, see my original article.

Now, it is impossible for anyone to update updated_at or created_at manually. If you want to set a custom published date, I suggest you have a third non-protect field called published_at. This could be useful for when you want to write a post and publish it later.

Hope this helps,

J


Related Posts

© 2024 Code.Build