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

bar*_*oma 1 postgresql database-trigger

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

Pat*_*ick 6

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

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

对于每个表,你应该有这样的触发器:

CREATE TRIGGER set_createddate
BEFORE INSERT ON <table name>
FOR EACH ROW EXECUTE PROCEDURE set_created_date();
Run Code Online (Sandbox Code Playgroud)

您可以使用此代码为所有54个表设置触发器(首先创建触发器功能):

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;
Run Code Online (Sandbox Code Playgroud)

这显然假设没有其他表名为列createddate.您可以通过查询information_schema.columns表格轻松查看.


小智 5

对于那些对帕特里克的解决方案有疑问的人。这里是相同的代码,但有一些改进:

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;
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,如果答案包含对代码用途的解释,以及为什么在不介绍其他内容的情况下解决问题的原因,那么它们会更有帮助。 (2认同)