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 originalCREATE TABLE personas
(
id INTEGER NOT NULL,
nombre_persona CHARACTER VARYING(50),
id_empresa INTEGER NOT NULL,
CONSTRAINT personas_pkey PRIMARY KEY (id),
CONSTRAINT personas_id_empresa_fkey FOREIGN KEY (id_empresa)
REFERENCES empresas (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
Empresas:
Código SQL:
Ver originalCREATE TABLE empresas
(
id INTEGER NOT NULL,
nombre_empresa CHARACTER VARYING(50),
CONSTRAINT empresas_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
Y la tabla resultante del JOIN (con los triggers):
Código SQL:
Ver originalCREATE TABLE ver
(
nombre_persona CHARACTER VARYING(50),
nombre_empresa CHARACTER VARYING(50)
)
WITH (
OIDS=FALSE
);
ALTER TABLE ver
OWNER TO david;
-- Trigger: ActEmpresas on ver
-- DROP TRIGGER "ActEmpresas" ON ver;
CREATE TRIGGER "ActEmpresas"
AFTER UPDATE
ON ver
FOR EACH ROW
EXECUTE PROCEDURE "ActualizaEmpresa"();
-- Trigger: ActPersonas on ver
-- DROP TRIGGER "ActPersonas" ON ver;
CREATE TRIGGER "ActPersonas"
AFTER UPDATE
ON ver
FOR EACH ROW
EXECUTE PROCEDURE "ActualizaNombre"();
-- Trigger: CambiaEmpresa on ver
-- DROP TRIGGER "CambiaEmpresa" ON ver;
CREATE TRIGGER "CambiaEmpresa"
BEFORE UPDATE
ON ver
FOR EACH ROW
EXECUTE PROCEDURE "CambiarEmpresa"();
Y las funciones:
Código SQL:
Ver originalCREATE OR REPLACE FUNCTION "ActualizaEmpresa"()
RETURNS TRIGGER AS
$BODY$
BEGIN
raise notice '(%)',NEW.nombre_empresa;
raise notice '(%)',OLD.nombre_empresa;
IF NOT EXISTS (SELECT empresas.nombre_empresa FROM empresas
WHERE empresas.nombre_empresa=NEW.nombre_empresa) THEN
UPDATE empresas SET nombre_empresa=NEW.nombre_empresa
WHERE nombre_empresa=OLD.nombre_empresa;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "ActualizaEmpresa"()
OWNER TO david;
Código SQL:
Ver originalCREATE OR REPLACE FUNCTION "ActualizaNombre"()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF NOT EXISTS (SELECT personas.nombre_persona FROM personas
WHERE personas.nombre_persona=NEW.nombre_persona) THEN
raise notice 'Actualizando';
UPDATE personas SET nombre_persona=NEW.nombre_persona
WHERE nombre_persona=OLD.nombre_persona;
END IF;
RETURN NEW;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "ActualizaNombre"()
OWNER TO david;
Código SQL:
Ver originalCREATE OR REPLACE FUNCTION "CambiarEmpresa"()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF EXISTS (SELECT empresas.nombre_empresa FROM empresas
WHERE empresas.nombre_empresa=NEW.nombre_empresa) THEN
raise notice 'Cambiando la empresa del trabajador';
UPDATE personas SET id_empresa= (SELECT id FROM empresas WHERE empresas.nombre_empresa = NEW.nombre_empresa)
WHERE nombre_persona=OLD.nombre_persona;
ELSE
raise notice 'No existe la empresa!!!';
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "CambiarEmpresa"()
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