包含创建日期

时间:2016-04-29 09:24:27

标签: postgresql database-trigger

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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;

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

createddate

这显然假设没有其他表具有名为information_schema.columns的列。您可以通过查询def findValue(value): try: myfile = open(file, "r") try: for line in myfile: if value in line: line = do_something return line finally: myfile.close() except IOError: print "File does not exist!" sys.exit() except None as e: print "Value not found in file" sys.exit() 表格轻松查看。

答案 1 :(得分: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;