包含创建日期的所有表的 Postgresql 触发器

Postgresql trigger for all tables that include create date

我的 postgresql 数据库中有 54 个表。大多数表格都包含数据的创建日期和时间。我想为所有包含 CreatedDate 列的表创建一个全局触发器。并且此触发器将在插入记录时更新列。

每个 table 都需要自己的触发器,但您可以使用单个触发器函数:

CREATE FUNCTION set_created_date() RETURNS trigger AS $$
BEGIN
  NEW.createddate := CURRENT_TIME;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

对于每个 table 你应该有一个这样的触发器:

CREATE TRIGGER set_createddate
BEFORE INSERT ON <table name>
FOR EACH ROW EXECUTE PROCEDURE set_created_date();

您可以使用以下代码为所有 54 个 table 设置触发器(首先创建触发器函数):

DO $$
DECLARE
    t record;
BEGIN
    FOR t IN 
        SELECT * FROM information_schema.columns
        WHERE column_name = 'createddate'
    LOOP
        EXECUTE format('CREATE TRIGGER set_createddate
                        BEFORE INSERT ON %I.%I
                        FOR EACH ROW EXECUTE PROCEDURE set_created_date()',
                        t.schema_name, t.table_name);
    END LOOP;
END;
$$ LANGUAGE plpgsql;

这显然假设没有其他 table 具有名为 createddate 的列。您可以通过查询 information_schema.columns table.

轻松检查

对于那些对 Patrick 的解决方案有疑问的人。 这里有一些改进的相同代码:

DO $$
DECLARE
    t text;
BEGIN
    FOR t IN 
        SELECT table_name FROM information_schema.columns
        WHERE column_name = 'createddate'
    LOOP
        EXECUTE format('CREATE TRIGGER set_createddate
                        BEFORE INSERT ON %I
                        FOR EACH ROW EXECUTE PROCEDURE set_created_date()',
                        t);
    END LOOP;
END;
$$ LANGUAGE plpgsql;