Postgresql
PostgresQL 刪除觸發器不刪除行
我目前正在為我的數據庫創建存檔記錄,其中每個表 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<>在這裡擺弄