2

我是 PostgreSQL 触发器的新手。
在这个例子中我有 3 个表table1table2并且table3

  • 触发器在 上触发新记录table1
  • 触发器函数循环遍历与来自 的新记录table2相同的所有记录。product_idtable1
  • table3它从前 2 个表中插入一些混合值。
  • 之后,将相同的INSERT查询插入到测试表中以进行测试。

问题是INSERTontable3没有发生。测试表很好,记录的INSERT插入查询可以毫无问题地执行,所以我不知道为什么它没有在触发器/函数中执行。

创建或替换函数 my_trigger() 将触发器返回为 $my_trigger$
声明 r 记录;
开始
  FOR r IN SELECT t2.id_t2, t2.name_1, t2.name_2, t2.name_3 FROM table2 t2 WHERE t2.product_id=NEW.product_id
  环形
    EXECUTE 'INSERT INTO table3 (id_t3, id_t1, name_1, name_2, name_3, bool_t2) VALUES (' || r.id_t2 || ',' || NEW.id_t1 || ', ''' || r.name_1 || ''',''' || r.name_2 || ''',''' || r.name_3 || ''', TRUE);';
    INSERT INTO test (field1, field2) VALUES(r.id_t2, 'INSERT INTO table3 (id_t3, id_t1, name_1, name_2, name_3, bool_t2) VALUES (' || r.id_t2 || ',' || NEW.id_t1 | | ', ''' || r.name_1 || ''',''' || r.name_2 || ''',''' || r.name_3 || ''', TRUE);') ;
  结束循环;
返回新的;
结尾;
$my_trigger$ 语言 plpgsql;

编辑:正如@Rachcha 所问,触发器本身是这样定义的:

CREATE TRIGGER my_trigger
  AFTER INSERT
  ON table1
  FOR EACH ROW
  EXECUTE PROCEDURE my_trigger();

编辑 2:我也尝试过不插入EXECUTE,但结果是一样的:没有错误,但没有插入table3.

4

1 回答 1

1

更简单的功能

  • RETURN NEWAFTER触发器中没有任何意义。我RETURN NULL改用。在这里引用手册

    操作后触发的行级触发器将忽略返回值,因此它们可以返回 NULL。

  • 使用LOOP. 请改用简单的 SQL 语句。

  • 使用动态 SQL ( EXECUTE) 毫无意义。

CREATE OR REPLACE FUNCTION my_trigger()
  RETURNS TRIGGER AS
$my_trigger$
BEGIN

INSERT INTO table3 (id_t3, id_t1, name_1, name_2, name_3, bool_t2)
SELECT t2.id_t2, NEW.id_t1, t2.name_1, t2.name_2, t2.name_3, TRUE
FROM   table2 t2
WHERE  t2.product_id = NEW.product_id;

INSERT INTO test (field1, field2)
SELECT t2.id_t2, '??un_known??'
FROM   table2 t2
WHERE  t2.product_id = NEW.product_id;

RETURN NULL;

END
$my_trigger$ LANGUAGE plpgsql;

这应该工作!-> SQLfiddle 演示

调试

如果它不起作用,则问题不在您的问题中。您是否在或 table上定义了任何其他触发器或规则?table1test

要调试,请将此行添加到您的触发函数中,以查看您是否到达那里以及其中的值是什么NEW

RAISE EXCEPTION 'Values in NEW: %', NEW::text;
于 2013-03-19T16:47:19.460 回答