2012-09-10 9 views
11

Mam tabelę o nazwie nagrody. Jak zamontować Trigger w PostgreSQL, gdzie każda wstawka w tabeli nagradza inną tabelę?Wstaw wyzwalacz, aby zaktualizować inną tabelę, używając PostgreSQL

+1

mógłbyś podać kilka mor e szczegóły? Czy ta "inna tabela" jest pojedynczą, oddzielną tabelą lub wieloma tabelami opartymi na wartości niektórych pól w nagrodach. – jcater

+2

http://www.postgresql.org/docs/8.1/static/triggers.html – ertx

+2

@ertx Lepiej połączyć z/current/doc zamiast/8.1/doc, to jest * bardzo * nieaktualne. –

Odpowiedz

4

Chcesz documenation for PL/PgSQL triggers, który omawia właśnie ten przypadek między innymi. Ogólny numer documentation on triggers również może być przydatny.

Można użyć do tego wyzwalacza BEFORE lub AFTER. Prawdopodobnie użyłbym spustu AFTER, więc mój spust zobaczył ostateczną wersję wstawianego wiersza. Oczywiście, chcesz mieć FOR EACH ROW.

+0

Hej @Craig Ringer jest celem FOR EACH ROW dla insertów wsadowych? – rosenthal

+1

@rosenthal Huh? Wyzwalacze "DLA KAŻDEGO STATYSTYKA" nie mają dostępu do wiersza 'NEW'. Więc nawet gdybyś robił pojedynczy wiersz 'INSERT', nie byłby do tego użyteczny. –

+0

Nie miałem na myśli tego, przepraszam za mój zły wybór w słowach. Mam na myśli to, co robią FOR EACH ROW? Spojrzałem na dokumentację Postgres i teraz to rozumiem. "Wyzwalacz oznaczony DLA KAŻDEGO WIERSZA jest wywoływany raz dla każdego wiersza, który modyfikuje operacja." – rosenthal

25

Tutaj mamy dwie tabele nazwanych table1 i table2. Za pomocą spustu zaktualizuję table2 po wstawieniu do table1.

Tworzenie tabel

CREATE TABLE table1 
(
    id integer NOT NULL, 
    name character varying, 
    CONSTRAINT table1_pkey PRIMARY KEY (id) 
) 

CREATE TABLE table2 
(
    id integer NOT NULL, 
    name character varying 
) 

Funkcja wyzwalania

CREATE OR REPLACE FUNCTION function_copy() RETURNS TRIGGER AS 
$BODY$ 
BEGIN 
    INSERT INTO 
     table2(id,name) 
     VALUES(new.id,new.name); 

      RETURN new; 
END; 
$BODY$ 
language plpgsql; 

Trigger

CREATE TRIGGER trig_copy 
    AFTER INSERT ON table1 
    FOR EACH ROW 
    EXECUTE PROCEDURE function_copy(); 
+0

W wyzwalaczu Funkcja, jak wie, wstawić wartości z pierwszej tabeli? Czy nie musimy pisać "z tabeli 1" po "wartościach (new.id, new.name)"? –

Powiązane problemy