2011-07-27 5 views
1

Quelle est la manière la plus efficace de créer ce déclencheur dans Postgres?Trigger dans Postgres DB

Je vais présenter ci-dessous un exemple très simplifié à ce dont j'ai besoin pour mes objectifs, mais il est basé sur le même concept.

Tenir compte, nous avons obtenu le schéma défini ci-dessous:

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); 

Ensuite, chaque fois qu'un nouvel élément est ajouté, nous vérifions si elle est sur la liste noire (comparant la PART_NO), et si elle est, nous créons une nouvelle entrée sur la table des matches.

Répondre

2

Vous voudriez un avant-insertion ou après insertion trigger sur items:

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

Ensuite, la fonction check_blacklist ressemblerait à quelque chose comme ceci:

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; 

Le drôle de $$ est, plus ou moins, la version SQL d'un heredoc.

Cela enveloppe le contrôle "est-il sur la liste noire" et l'insertion matches dans un simple bit de SQL. Le NEW variable in a trigger est une référence à la nouvelle ligne avec laquelle vous travaillez. Si NEW.part_no ne correspond à rien dans blacklist, le SELECT ne produira rien et l'INSERT ne sera pas exécuté. Vraisemblablement, vous auriez un index sur blacklist.part_no (qui ressemble à un PK de toute façon) donc ce qui précède devrait être assez rapide.

La documentation PostgreSQL est très bonne et contient une section entière sur stored procedures and triggers si vous avez besoin d'une référence.

+0

merci, mais pourriez-vous également expliquer la syntaxe pour créer la fonction? – Bob

+0

merci ... c'est bon – Bob

Questions connexes