Postgresql触发器函数似乎会阻止任何记录的插入

3

我是Postgresql的新手。

我创建了一个函数,用于检查INSERT语句是否尝试在两个不同的表中创建相同的值。

    CREATE OR REPLACE FUNCTION check_pids_not_equal()
  RETURNS trigger AS
$BODY$
begin 
if exists (select *
from cards c , echecks e
where c.pid = e.pid)
then
raise NOTICE 'Must have different PID than entry in cards.pid';
end if;
return null;
end
$BODY$
  LANGUAGE plpgsql

我这样分配了触发器:

我这样分配了触发器:

CREATE TRIGGER check_cards_pids_trigger
  BEFORE INSERT OR UPDATE
  ON cards
  FOR EACH ROW
  EXECUTE PROCEDURE check_pids_not_equal();

现在,每当我尝试在Cards表中插入记录时,即使记录明显存在缺失列或错误的列类型,我总是得到INSERT 0 0而没有错误消息。

你有什么想法吗?另外,如何显示更多的错误报告?

1个回答

2

如果您想插入记录,您需要return new像这样:

CREATE OR REPLACE FUNCTION check_pids_not_equal()
  RETURNS trigger AS
$BODY$
begin 
    if exists (select * from cards c, echecks e where c.pid = e.pid) then
        raise NOTICE 'Must have different PID than entry in cards.pid';
        return null;
    end if;
    return new;
end
$BODY$
LANGUAGE plpgsql

这解决了插入问题(我可以插入记录),但当我在表Echecks中插入一个已存在于Cards pid中的pid时,插入仍然完成,即触发器没有阻止插入并引发所需的通知。 - runit
不知道你的“exists”检查应该做什么。无论如何,你可以使用new.pid来获取当前插入记录的pid - Roman Pekar
2
谢谢。我需要使用新的.pid关键字。我一直试图使用cards.pid作为参考,但是你的评论让我意识到触发器在插入之前就已经起作用了。因此cards.pid还没有在引用的表中。非常感谢。 - runit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接