2016-04-29 54 views
1

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

+0

为什么不简单地将列更改为'default now()'? –

+0

默认现在()适用于SQL插入查询。但我使用QGIS等第三方软件将记录插入表格。在这种情况下,新的记录是通过手工形式进行的。如果我手动忘记填充创建日期,则日期字段将变为空到数据库表。 – barteloma

+0

好的。你为什么不试试问gis.stackexchange.com?肯定有这个解决方案。我怀疑qgis不能处理插入的默认值。 –

回答

3

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

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

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

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

您可以设定触发对于使用此代码的所有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; 

This obvio我们假定没有其他表中的列名为createddate。这可以通过查询information_schema.columns表格轻松检查。

0

对于帕特里克解决方案有问题的人。 这里有一些改进的代码:

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; 
+0

通常,如果解释代码要做什么,以及为什么解决问题而不引入其他问题,答案会更有帮助。 – Peter