我创建了一个函数,它写入有关表删除的信息。还有另一个函数,它只是在删除后添加一个触发器调用。但我想将整行作为字符串存储到我的表中。根据 Postgresql 文档,它应该通过将“OLD.*”添加到基于文本的列中来工作。但它没有告诉我我试图在这个表中放入太多列。OLD 来自 RECORD 类型。我想把它放在我的文本字段中,比如“value1,value2,value3”,或者它可以是“colname:value,colname2:value”。我不在乎,我只想查看已删除的行。
另一种方法是记录来自 pg_stat_activity 的所有删除查询。但我不知道该怎么做。我猜每秒简单地访问 pg_stat_activity 会导致过多的流量。
我的表很简单:
create table delete_history (date timestamp, tablename varchar(100), data text);
这是我的功能:
CREATE or REPLACE FUNCTION ondelete() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO delete_history VALUES (CURRENT_TIMESTAMP, TG_TABLE_NAME, OLD.*);
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
这是我的触发器:
CREATE OR REPLACE FUNCTION history_create_triggers() RETURNS void
AS $$
DECLARE
r RECORD;
BEGIN
FOR r IN SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type='BASE TABLE' LOOP
EXECUTE 'CREATE TRIGGER log_history AFTER DELETE ON public.' || r.table_name || ' FOR EACH ROW EXECUTE PROCEDURE ondelete();';
END LOOP;
END;
$$ LANGUAGE plpgsql;