有条件地将插入插入到插入之前触发器中,而不会返回错误

时间:2019-01-03 14:53:16

标签: sql postgresql database-trigger

在插入触发器之前,我具有以下功能:

CREATE OR REPLACE FUNCTION schema.table_somefun()
RETURNS trigger AS
LANGUAGE 'plpgsql';
$BODY$
BEGIN
  IF NEW.col2 NOT NULL THEN
    NEW.col1 := CASE NEW.col1
                     WHEN '121432' THEN '321123'
                     ELSE <command> END CASE; --there should be a command aborting insertion without error or exception
  END IF;
  RETURN NEW;
END;
$BODY$

ELSE语句应中止插入。有没有命令可以删除查询而不通知给客户端并使表保持不变?

1 个答案:

答案 0 :(得分:1)

只需使用

RETURN NULL;

代替

RETURN NEW;

取消该行的INSERT,而不执行任何操作。

但是您不能在SQL CASE表达式的内部 中执行PL / pgSQL语句。 (不要将SQL CASE与类似的control structure CASE of PL/pgSQL混淆!)
可能看起来像这样:

CREATE OR REPLACE FUNCTION schema.table_somefun()
  RETURNS trigger AS
$func$
BEGIN
   IF NEW.col2 NOT NULL THEN
      IF NEW.col1 = '121432' THEN  -- could also be plpgsql CASE ...
         NEW.col1 := '321123';
      ELSE
         RETURN NULL;
      END IF;
  END IF;
  RETURN NEW;
END
$func$  LANGUAGE plpgsql;