如何在Postgresql上记录删除查询?

时间:2013-08-23 10:22:40

标签: postgresql triggers

我创建了一个写有关表删除信息的函数。 另一个函数只是在删除后添加一个触发器调用。 但我想将整行作为字符串存储到我的表中。 根据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;

1 个答案:

答案 0 :(得分:2)

您可以将record类型转换为text

CREATE or REPLACE FUNCTION ondelete() RETURNS TRIGGER AS $$
BEGIN
 INSERT INTO delete_history VALUES (CURRENT_TIMESTAMP, TG_TABLE_NAME, OLD::text);
 RETURN OLD;
END;
$$ LANGUAGE plpgsql;

sql fiddle demo

另一种方法可能是使用row_to_json函数将您的行转换为JSON(如果您的版本为9.2):

CREATE or REPLACE FUNCTION ondelete() RETURNS TRIGGER AS $$
BEGIN
 INSERT INTO delete_history VALUES (CURRENT_TIMESTAMP, TG_TABLE_NAME, row_to_json(OLD));
 RETURN OLD;
END;
$$ LANGUAGE plpgsql;

sql fiddle demo

另一种方法是将您的数据转换为hstore

CREATE or REPLACE FUNCTION ondelete() RETURNS TRIGGER AS $$
BEGIN
 INSERT INTO delete_history VALUES (CURRENT_TIMESTAMP, TG_TABLE_NAME, hstore(OLD));
 RETURN OLD;
END;
$$ LANGUAGE plpgsql;

我现在无法测试 - sqlfiddle不允许使用hstore。