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

包含创建日期的所有表的Postgresql触发器,postgresql,database-trigger,Postgresql,Database Trigger,我的postgresql数据库中有54个表。大多数表都包含数据的创建日期和时间。我想为包含CreatedDate列的所有表创建一个全局触发器。当插入记录时,此触发器将更新列。每个表都需要自己的触发器,但您可以使用单个触发器功能: CREATE FUNCTION set_created_date() RETURNS trigger AS $$ BEGIN NEW.createddate := CURRENT_TIME; RETURN NEW; END; $$ LANGUAGE plpgsq

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

每个表都需要自己的触发器,但您可以使用单个触发器功能:

CREATE FUNCTION set_created_date() RETURNS trigger AS $$
BEGIN
  NEW.createddate := CURRENT_TIME;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;
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;
对于每个表,都应该有如下触发器:

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

这显然假设没有其他表具有名为
createddate
的列。您可以通过查询
信息\u schema.columns
表来轻松检查这一点。

对于那些对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;

为什么不直接将列更改为
default now()
?default now()适用于sql插入查询。但我使用第三方软件,如QGIS,将记录插入表中。在本研究中,新记录是通过表格手动创建的。如果我忘记手动填写创建日期,则数据库table.Ok的日期字段将变为NULL。你为什么不试试在gis.stackexchange.com上问问呢?肯定有解决办法。我怀疑qgis不能处理插入的默认值。一般来说,如果答案中包含对代码意图的解释,那么答案会更有帮助,Gnoocki的答案和Patrick的答案之间的区别是1)Patrick在触发器中使用定义模式名,而Gnoocki仅定义表名;2)Gnoocki将函数声明为文本,而Patrick将其定义为记录。我更喜欢帕特里克的答案。
t.schema\u name
应该是
t.table\u schema