2013-03-26 47 views
0

我只想维护当前1个月的记录日志细节。需要删除过去的记录日志细节了尝试这种代码,但不能工作这一点,触发器删除postgresql中的过去记录

create sequence userseq1; 

CREATE TABLE users 
(id integer NOT NULL DEFAULT nextval('userseq1'::regclass) 
); 

INSERT INTO users VALUES(126); 

CREATE TABLE History 
(userid integer 
, createdate timestamp 
); 

CREATE OR REPLACE FUNCTION recordcreatetime() RETURNS trigger language plpgsql 
AS $$ 
DECLARE 
BEGIN 
    INSERT INTO History values(new.id,NOW()); 
    RETURN NEW; 
END; 
$$; 

CREATE TRIGGER user_hist 
BEFORE INSERT ON users 
FOR EACH ROW 
EXECUTE procedure recordcreatetime(); 

但是,它正在由一个adding.I插入值测序一个要删除以前1月历史日志详细信息。我想这下面的代码,它不工作

CREATE OR REPLACE FUNCTION trf_keep_row_number_steady() 
RETURNS TRIGGER AS 
$body$ 
DECLARE 
BEGIN 
     IF (SELECT count(createdate) FROM history) > rownum_limit 
    THEN 
     DELETE FROM history 
     WHERE createdate = (SELECT min(createdate) FROM history);   
    END IF; 
END; 
$body$ 
LANGUAGE plpgsql; 

CREATE TRIGGER tr_keep_row_number_steady 
AFTER INSERT ON history 
FOR EACH ROW EXECUTE PROCEDURE trf_keep_row_number_steady(); 

回答

1

我可以在你的第二个代码块中看到,你有history表的触发器和你在同一个触发器试图DELETE FROM history

不允许通过同一张表上的触发器在表上插入/更新/删除。请考虑其他一些替代方法,例如,在主要INSERT声明之前或之后为所需的行清理运行单独的DELETE声明。

+0

感谢您的回复。我试过,但它不工作。你可以提供任何文档或示例代码....... – Patrick 2013-03-26 11:43:15

+0

其实postgresql允许这样做。但@Patrick应该提供一个错误信息,而不是“它不工作”。乍一看,函数在语法上不正确,无论如何因为这个'rownum_limit'没有定义。 – 2013-03-26 17:03:55