1

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

1 回答 1

3

您可以将类型转换recordtext

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。

于 2013-08-23T10:27:38.130 回答