-- We try to ensure every table has `created_at` and `updated_at` columns, which can help immensely with debugging -- and auditing. -- -- While `created_at` can just be `default now()`, setting `updated_at` on update requires a trigger which -- is a lot of boilerplate. These two functions save us from writing that every time as instead we can just do -- -- select accounts.trigger_updated_at(''); -- -- after a `CREATE TABLE`. create or replace function accounts.set_updated_at() returns trigger as $$ begin NEW.updated_at = now(); return NEW; end; $$ language plpgsql; create or replace function accounts.trigger_updated_at(tablename regclass) returns void as $$ begin execute format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s FOR EACH ROW WHEN (OLD is distinct from NEW) EXECUTE FUNCTION accounts.set_updated_at();', tablename); end; $$ language plpgsql;