Ver Mensaje Individual
  #11 (permalink)  
Antiguo 20/05/2015, 01:53
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Actualizar datos desde una tabla resultado de JOIN

Bueno, al final he hecho esto:
Parto de 3 tablas, una de ellas producto de un JOIN de las otras dos:

Personas:

Código SQL:
Ver original
  1. CREATE TABLE personas
  2. (
  3.   id INTEGER NOT NULL,
  4.   nombre_persona CHARACTER VARYING(50),
  5.   id_empresa INTEGER NOT NULL,
  6.   CONSTRAINT personas_pkey PRIMARY KEY (id),
  7.   CONSTRAINT personas_id_empresa_fkey FOREIGN KEY (id_empresa)
  8.       REFERENCES empresas (id) MATCH SIMPLE
  9.       ON UPDATE NO ACTION ON DELETE NO ACTION
  10. )
  11. WITH (
  12.   OIDS=FALSE
  13. );

Empresas:

Código SQL:
Ver original
  1. CREATE TABLE empresas
  2. (
  3.   id INTEGER NOT NULL,
  4.   nombre_empresa CHARACTER VARYING(50),
  5.   CONSTRAINT empresas_pkey PRIMARY KEY (id)
  6. )
  7. WITH (
  8.   OIDS=FALSE
  9. );

Y la tabla resultante del JOIN (con los triggers):
Código SQL:
Ver original
  1. CREATE TABLE ver
  2. (
  3.   nombre_persona CHARACTER VARYING(50),
  4.   nombre_empresa CHARACTER VARYING(50)
  5. )
  6. WITH (
  7.   OIDS=FALSE
  8. );
  9. ALTER TABLE ver
  10.   OWNER TO david;
  11.  
  12. -- Trigger: ActEmpresas on ver
  13.  
  14. -- DROP TRIGGER "ActEmpresas" ON ver;
  15.  
  16. CREATE TRIGGER "ActEmpresas"
  17.   AFTER UPDATE
  18.   ON ver
  19.   FOR EACH ROW
  20.   EXECUTE PROCEDURE "ActualizaEmpresa"();
  21.  
  22. -- Trigger: ActPersonas on ver
  23.  
  24. -- DROP TRIGGER "ActPersonas" ON ver;
  25.  
  26. CREATE TRIGGER "ActPersonas"
  27.   AFTER UPDATE
  28.   ON ver
  29.   FOR EACH ROW
  30.   EXECUTE PROCEDURE "ActualizaNombre"();
  31.  
  32. -- Trigger: CambiaEmpresa on ver
  33.  
  34. -- DROP TRIGGER "CambiaEmpresa" ON ver;
  35.  
  36. CREATE TRIGGER "CambiaEmpresa"
  37.   BEFORE UPDATE
  38.   ON ver
  39.   FOR EACH ROW
  40.   EXECUTE PROCEDURE "CambiarEmpresa"();

Y las funciones:
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION "ActualizaEmpresa"()
  2.   RETURNS TRIGGER AS
  3. $BODY$
  4. BEGIN
  5. raise notice '(%)',NEW.nombre_empresa;
  6. raise notice '(%)',OLD.nombre_empresa;
  7. IF NOT EXISTS (SELECT empresas.nombre_empresa FROM empresas
  8.             WHERE empresas.nombre_empresa=NEW.nombre_empresa) THEN
  9. UPDATE empresas SET nombre_empresa=NEW.nombre_empresa
  10.     WHERE nombre_empresa=OLD.nombre_empresa;
  11. END IF;
  12. RETURN NEW;
  13. END;
  14. $BODY$
  15.   LANGUAGE plpgsql VOLATILE
  16.   COST 100;
  17. ALTER FUNCTION "ActualizaEmpresa"()
  18.   OWNER TO david;

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION "ActualizaNombre"()
  2.   RETURNS TRIGGER AS
  3. $BODY$
  4. BEGIN
  5. IF NOT EXISTS (SELECT personas.nombre_persona FROM personas
  6.             WHERE personas.nombre_persona=NEW.nombre_persona) THEN
  7. raise notice 'Actualizando';
  8. UPDATE personas SET nombre_persona=NEW.nombre_persona
  9.     WHERE nombre_persona=OLD.nombre_persona;
  10. END IF;
  11. RETURN NEW;
  12. END;$BODY$
  13.   LANGUAGE plpgsql VOLATILE
  14.   COST 100;
  15. ALTER FUNCTION "ActualizaNombre"()
  16.   OWNER TO david;

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION "CambiarEmpresa"()
  2.   RETURNS TRIGGER AS
  3. $BODY$
  4. BEGIN
  5. IF EXISTS (SELECT empresas.nombre_empresa FROM empresas
  6.             WHERE empresas.nombre_empresa=NEW.nombre_empresa) THEN
  7. raise notice 'Cambiando la empresa del trabajador';
  8. UPDATE personas SET id_empresa= (SELECT id FROM empresas WHERE empresas.nombre_empresa = NEW.nombre_empresa)
  9.     WHERE nombre_persona=OLD.nombre_persona;
  10.     ELSE
  11.     raise notice 'No existe la empresa!!!';
  12. END IF;
  13. RETURN NEW;
  14. END;
  15. $BODY$
  16.   LANGUAGE plpgsql VOLATILE
  17.   COST 100;
  18. ALTER FUNCTION "CambiarEmpresa"()
  19.   OWNER TO david;

De esta forma garantizo que cambiando datos en la tabla "ver" estos se actualizan de forma automática en la tabla origen.

P.D.: Dicho lo cual......todo esto no me sirve para nada porque QGIS puede trabajar con vistas, así que me puedo ahorrar el festival que había montado.

No sé si de la forma más ortodoxa, pero marco el tema como solucionado
__________________
Mi calculadora en Qt