包含创建日期的所有表的 Postgresql 触发器
Postgresql trigger for all tables that include create date
我的 postgresql 数据库中有 54 个表。大多数表格都包含数据的创建日期和时间。我想为所有包含 CreatedDate 列的表创建一个全局触发器。并且此触发器将在插入记录时更新列。
每个 table 都需要自己的触发器,但您可以使用单个触发器函数:
CREATE FUNCTION set_created_date() RETURNS trigger AS $$
BEGIN
NEW.createddate := CURRENT_TIME;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
对于每个 table 你应该有一个这样的触发器:
CREATE TRIGGER set_createddate
BEFORE INSERT ON <table name>
FOR EACH ROW EXECUTE PROCEDURE set_created_date();
您可以使用以下代码为所有 54 个 table 设置触发器(首先创建触发器函数):
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;
这显然假设没有其他 table 具有名为 createddate
的列。您可以通过查询 information_schema.columns
table.
轻松检查
对于那些对 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;
我的 postgresql 数据库中有 54 个表。大多数表格都包含数据的创建日期和时间。我想为所有包含 CreatedDate 列的表创建一个全局触发器。并且此触发器将在插入记录时更新列。
每个 table 都需要自己的触发器,但您可以使用单个触发器函数:
CREATE FUNCTION set_created_date() RETURNS trigger AS $$
BEGIN
NEW.createddate := CURRENT_TIME;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
对于每个 table 你应该有一个这样的触发器:
CREATE TRIGGER set_createddate
BEFORE INSERT ON <table name>
FOR EACH ROW EXECUTE PROCEDURE set_created_date();
您可以使用以下代码为所有 54 个 table 设置触发器(首先创建触发器函数):
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;
这显然假设没有其他 table 具有名为 createddate
的列。您可以通过查询 information_schema.columns
table.
对于那些对 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;