Postgresql

PostgresQL 刪除觸發器不刪除行

  • January 24, 2021

我目前正在為我的數據庫創建存檔記錄,其中每個表 x 都有一個對應的 x_archive 表。我的解決方案是為每個需要複製的表創建一個觸發器,將刪除的數據插入存檔表。觸發器似乎執行得很好,數據被複製到存檔表中。但是,原始數據不會被刪除。觸發器似乎只在第一個刪除查詢上執行。如果我再次執行相同的刪除語句(在原始數據上),原始表中的行和存檔表中的行都將被刪除。我還嘗試創建專門用於插入特定表的觸發器函式,但結果相同。任何幫助是極大的讚賞。

觸發功能

CREATE OR REPLACE FUNCTION archive_record()
RETURNS TRIGGER AS $$
BEGIN
   RAISE NOTICE 'Running trigger';
   EXECUTE format('INSERT INTO %I.%I SELECT $1.*', TG_TABLE_SCHEMA, (TG_TABLE_NAME || '_archive'))
   USING OLD;
   RETURN NULL;
END;
$$ LANGUAGE PLPGSQL;

範例觸發器

CREATE TRIGGER delete_test
   AFTER DELETE
   ON test
   FOR EACH ROW
   EXECUTE PROCEDURE archive_record();

範例表

create table test
(
   id                  serial primary key,
   name                varchar(128) not null,
);

範例存檔表

CREATE TABLE test_archive (
) INHERITS(test);

繼承可能是一個有用的工具,但現在它有很多缺陷,正如你所注意到的。

所以你應該忽略它,如果系統沒有對你的想法做出反應

create table test
(
    id                  serial primary key,
    name                varchar(128) not null
);
create table test_archive
(
    id                  serial primary key,
    name                varchar(128) not null
);
CREATE OR REPLACE FUNCTION archive_record()
RETURNS TRIGGER AS $$
BEGIN
    RAISE NOTICE 'Running trigger';
    EXECUTE format('INSERT INTO %I.%I SELECT $1.*', TG_TABLE_SCHEMA, (TG_TABLE_NAME || '_archive'))
    USING OLD;
    RETURN NULL;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER delete_test
    AFTER DELETE
    ON test
    FOR EACH ROW
    EXECUTE PROCEDURE archive_record();
insert into test values (1,'test1'),(2,'test2')
2 行受影響
DELETE FROM test WHERE id = 1
1 行受影響
SELECT * FROM test_archive
編號 | 姓名
-: | :----
 1 | 測試1
SELECT * FROM test
編號 | 姓名
-: | :----
 2 | 測試2

db<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/283840