Postgres触发器会在删除之前将行插入另一个表中

时间:2015-02-09 00:42:33

标签: postgresql triggers backup

我有一个表(entry_table),其中填充了客户当前用于我们的前端Web要素服务的各种地理位置数据。如果用户在WFS中删除了他们的条目,它将在我们的postgres数据库中删除。我想创建一个触发器,它将运行INSERT命令将行(大约25列数据)复制到第二个表(historical_entry_table),因此如果以后再次需要这些条目,则可以轻松检索它们。

这是我到目前为止所做的工作。我是Triggers的新手,所以我知道语法已关闭。不知道从哪里开始。我正在运行postgres 8.4

在表格中:

CREATE TRIGGER trigger_name BEFORE DELETE 
    ON entry_table
    FOR EACH ROW
    EXECUTE PROCEDURE trigger_backup_row

功能本身:

CREATE OR REPLACE FUNCTION trigger_backup_row()
    LANGUAGE SQL
    RETURNS trigger AS
$BODY$
BEGIN

INSERT INTO historical_entry_table (col1, col2, etc) values (OLD.col1, OLD.col2, OL
RETURN NULL:

END;
$BODY$ 

3 个答案:

答案 0 :(得分:1)

你刚刚得到它。你的代码在这里更新了:

CREATE OR REPLACE FUNCTION trigger_backup_row()
    RETURN trigger AS
$BODY$
    BEGIN
        INSERT INTO historical_entry_table (col1, col2, etc) values (OLD.col1, OLD.col2, OLD.etc);
    END;
$BODY$     

答案 1 :(得分:1)

我将在这里提出一个有效的例子:

CREATE OR REPLACE FUNCTION trigger_backup_row()
    RETURNS trigger AS
$BODY$
    BEGIN
INSERT INTO PCIcards_backup (MODEL, SUBSYSTEM_DEVICE, ADAPTER, MAPPING) values (NEW.MODEL, NEW.SUBSYSTEM_DEVICE, NEW.ADAPTER, NEW.MAPPING);
    RETURN NEW;
    END;
$BODY$     
   language PLPGSQL

如您所见,您只需要使用param PLPGSQL在文件末尾设置语言,因为SQL无法返回触发器。

答案 2 :(得分:0)

发布最后一个答案的正确版本:

CREATE OR REPLACE FUNCTION trigger_backup_row()
  RETURN trigger 
  LANGUAGE plpgsql
AS
$$
  BEGIN
    INSERT INTO historical_entry_table (col1, col2, etc) values (OLD.col1, OLD.col2, OLD.etc);
    RETURN new;
  END;
$$