bar*_*oma 1 postgresql database-trigger
我的postgresql数据库中有54个表.并且大多数表包括创建数据的日期.我想为包含CreatedDate列的所有表创建一个全局触发器.插入记录时,此触发器将更新列.
每个表都需要自己的触发器,但您可以使用单个触发器函数:
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)
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |