包含创建日期的所有表的Postgresql触发器
我的postgresql数据库中有54个表。大多数表都包含数据的创建日期和时间。我想为包含CreatedDate列的所有表创建一个全局触发器。当插入记录时,此触发器将更新列。每个表都需要自己的触发器,但您可以使用单个触发器功能:包含创建日期的所有表的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
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