在Postgres DB中触发

时间:2011-07-27 04:27:33

标签: postgresql triggers

在Postgres中创建此触发器的最有效方法是什么。

我将在下面提供一个非常简化的示例,说明我的目的,但它基于相同的概念。

考虑一下,我们已经得到了下面定义的模式:

CREATE TABLE items (
  item_id int4,
  part_no int4,
  description text);

CREATE TABLE blacklist (
  part_no int4,
  reason text);

CREATE TABLE matches (
  item_id int4,
  part_no int4,
  reason text);

然后,每次添加新项目时,我们都会检查它是否在黑名单中(比较part_no),如果是,我们在匹配表上创建一个新条目。

1 个答案:

答案 0 :(得分:2)

您需要items上的插入前或插入后trigger

create trigger blacklist_matches after insert on items
for each row execute procedure check_blacklist();

然后check_blacklist函数看起来像这样:

create function check_blacklist()
    returns trigger as $$
begin
    insert into matches (item_id, part_no, reason)
    select NEW.item_id, NEW.part_no, blacklist.reason
    from blacklist
    where blacklist.part_no = NEW.part_no;
    return null;
end;
$$ language plpgsql;

看起来很滑稽的$$或多或少是heredoc的SQL版本。

它包含了“它是否在黑名单”检查和matches插入一个简单的SQL。 NEW variable in a trigger是对您正在使用的新行的引用。如果NEW.part_noblacklist中的任何内容都不匹配,那么SELECT将不会产生任何内容,并且INSERT将不会被执行。

据推测,你的blacklist.part_no上有一个索引(无论如何看起来像PK),所以上面应该足够快。

PostgreSQL文档相当不错,如果需要参考,可以在stored procedures and triggers上有一个完整的部分。