Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres触发器:将旧记录写入新表_Sql_Postgresql_Plpgsql_Sql Delete_Database Trigger - Fatal编程技术网

Sql Postgres触发器:将旧记录写入新表

Sql Postgres触发器:将旧记录写入新表,sql,postgresql,plpgsql,sql-delete,database-trigger,Sql,Postgresql,Plpgsql,Sql Delete,Database Trigger,我有一组不同的表,它们在删除时有一个触发器。我想将删除的行写入不同架构上的like表 例如,假设我有两个不同的表: CREATE TABLE A (val1 TEXT, val2 TEXT) CREATE TABLE B (someval1 INT, someval2 TEXT, someval3 TEXT) 我在另一个模式上有这些表的副本 CREATE SCHEMA backup; CREATE TABLE backup.A (like A); CREATE TABLE backup.B (

我有一组不同的表,它们在删除时有一个触发器。我想将删除的行写入不同架构上的like表

例如,假设我有两个不同的表:

CREATE TABLE A (val1 TEXT, val2 TEXT)
CREATE TABLE B (someval1 INT, someval2 TEXT, someval3 TEXT)
我在另一个模式上有这些表的副本

CREATE SCHEMA backup;
CREATE TABLE backup.A (like A);
CREATE TABLE backup.B (like B);

每个非备份表A和B都有一个删除触发器(用plpgsql编写)。如果我从这两个表中删除了一条记录,我如何才能编写一个触发器函数,将删除的记录写入关联的备份表?

您确实可以使用触发器来完成此操作。每个表需要一个触发器,如:

create or replace function func_backup_tablea_before_delete()
return trigger as
$body$
begin
    insert into backup.tablea(val1, val2) values (old.val1, old.val2);
end;
$body$ 

create trigger trg_delete_a 
before delete on tablea
for each row
execute procedure func_backup_tablea_before_delete;

我能够使用一个非表特定的触发器函数将删除的记录写入备份表:

create or replace function track_delete() returns trigger as
$body$
BEGIN
    execute format('insert into backup.%I values($1.*)', tg_table_name) USING old;
END;
$body$
language plpgsql;

我正在寻找一种方法,用一个函数为所有表执行此操作,因为在我的实际情况中,有不止几个表:(