2012-09-10 18 views
11

Tengo una tabla llamada premios. ¿Cómo puedo montar un disparador en PostgreSQL donde cada inserción en la tabla otorga actualizaciones a una tabla diferente?Insertar activador para actualizar otra tabla usando PostgreSQL

+1

Podría dar algunos mor e detalles? Es esta "tabla diferente" una tabla única, separada, o tablas múltiples basadas en algún valor de algún campo en premios. – jcater

+2

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

+2

@ertx Es mejor vincular al/current/doc en lugar del /8.1/ doc, esto es * extremadamente * desactualizado. –

Respuesta

4

Quiere el documenation for PL/PgSQL triggers, que trata sobre este caso, entre otros. El general documentation on triggers también puede ser útil.

Puede utilizar un disparador BEFORE o AFTER para esto. Probablemente usaría un disparador AFTER para que mi desencadenador viera la versión final de la fila que se está insertando. Quiere FOR EACH ROW, por supuesto.

+0

Hola @Craig Ringer es el propósito de FOR EACH ROW para inserciones por lotes? – rosenthal

+1

@rosenthal Huh? Los activadores 'PARA CADA DECLARACIÓN' no tienen acceso a la fila' NUEVO'. Así que incluso si estuvieras haciendo una sola fila 'INSERT ', no sería útil para esto. –

+0

No quise decir eso, disculpe mi pobre elección de palabras. Quiero decir, ¿qué es EL PARA CADA FILA? Miré la documentación de Postgres y lo entendí ahora. "Un activador que está marcado PARA CADA FILA se llama una vez por cada fila que modifica la operación". – rosenthal

25

Aquí tenemos dos tablas denominadas table1 y table2. Usando un gatillo, actualizaré table2 al insertarlo en table1.

Crear las tablas

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 
) 

La función de disparo

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; 

El disparador

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

En el disparador ¿Funciona cómo sabe esto para insertar valores de la tabla uno? ¿No necesitamos escribir "desde la tabla 1" después de "valores (new.id, new.name)"? –

Cuestiones relacionadas