2011-07-27 4 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を比較する)チェック、および:

たちは下に定義されたスキーマを持っている、考えてみましょうマッチテーブルに新しいエントリを作成します。あなたは、インサートの前または後に挿入しitemstriggerをしたいと思います

答えて

2

:おかしい探して$$は、ある

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; 

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

その後check_blacklist関数は次のようになります多かれ少なかれ、heredocのSQL​​版です。

これは「それはブラックリストにあるのですか?」というチェックとmatchesの挿入をSQLの単純な1ビットで包みます。 NEW variable in a triggerは、作業している新しい行への参照です。 NEW.part_noblacklistのものと一致しない場合、SELECTは何も生成せず、INSERTは実行されません。

おそらく、あなたはblacklist.part_no(とにかくPKのように見える)のインデックスを持っているので、上記のようにすばやくすみます。

リファレンスが必要な場合は、PostgreSQLのマニュアルがかなり役に立ち、stored procedures and triggersに関するセクションがあります。

+0

thanxですが、関数を作成するための構文についても説明してください。 – Bob

+0

こんにちは..これはいいです – Bob

関連する問題