插入新触发器时保持默认行为SQL

时间:2018-12-12 14:07:18

标签: postgresql

假设我在桌子上有约束。当我尝试在其中插入没有正确数据的内容时,在控制台中收到一条错误消息,指出该行以及该IC被违反。

ERROR:  null value in column "column" violates not-null constraint
DETAIL:  Failing row contains (0, null, null, null, null).

现在,如果我添加一个:

CREATE OR REPLACE FUNCTION trigger_function()
  RETURNS trigger AS $BODY$
    BEGIN
     raise notice 'test';
     return null;
    END;
  $BODY$ LANGUAGE plpgsql;


create trigger test_trigger
  before update or insert
  on tablename
  for each row
  execute procedure trigger_function();

执行与我之前得到的相同的事情:

NOTICE:  test
INSERT 0 0

我知道此触发器并不是真正有用,但我仍在学习它们的工作原理。

是否可以保留以前的错误消息,并在其后添加我在trigger_function中所做的一切?为什么它会替换所有默认消息?

1 个答案:

答案 0 :(得分:1)

Quote from the manual

  

在触发行级触发器之前,可以返回空,以通知触发器管理器跳过该行的其余操作(即,不触发后续触发器,并且此行不会发生INSERT / UPDATE / DELETE)

(重点是我的)

因为触发器返回NULL,所以insert从未真正完成,因此没有违反约束的情况。

The output在psql控制台

INSERT 0 0

告诉您没有插入行。第二个值是插入的行数。


如果您想要“什么都不做”的触发器,则需要使用return new

CREATE OR REPLACE FUNCTION trigger_function()
  RETURNS trigger 
AS $BODY$
BEGIN
  raise notice 'test';
  return new; --<< here
END;
$BODY$ LANGUAGE plpgsql;