2011-07-27 154 views
1

在Postgres中創建此觸發器的最有效方法是什麼?Postgres DB中的觸發器

我將在下面展示一個非常簡單的示例,以說明我需要的目的,但它基於相同的概念。

考慮,我們有如下定義的架構:

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),如果是,我們在比賽表上創建一個新條目。

回答

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的完整章節。

+0

thanx,但你能否也請解釋創建函數的語法? – Bob

+0

thanx ..這很好 – Bob