0

現在の 1 か月の記録ログの詳細のみを維持したい。過去の記録ログの詳細を削除する必要があります。このコードを試してみましたが、これは機能しませんでした。

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();

ただし、1つずつ追加する順序で値を挿入することは機能しています。前の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();
4

1 に答える 1

1

history2 番目のコード ブロックで、テーブルにトリガーがありDELETE FROM history、同じトリガーを実行しようとしていることがわかります。

同じテーブルのトリガーによるテーブルの挿入/更新/削除は許可されていません。DELETEたとえば、メイン ステートメントの前後に必要な行のクリーンアップのために別のステートメントを実行するなど、別の代替案を考えてくださいINSERT

于 2013-03-26T07:49:27.817 に答える