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