PostgreSQL - DB_LINK

 
Vista:

DB_LINK

Publicado por Erika (3 intervenciones) el 08/03/2007 20:40:59
La funcion que tiene el codigo que se encuentra en la parte inferior es que base de datos pueda almacenar datos de forma local y simultaneamente en forma remota.

Para esto estoy haciendo uso de un trigger y, lo que quiero hacer es que mediante un dblink almacenar los datos de manera remota, el lenguaje del trigger es
plpgsql. Espero que alguen me pueda orientar acerca de como utilizar el dblink.

CREATE OR REPLACE FUNCTION COMBO () RETURNS TRIGGER AS
'
BEGIN
IF TG_OP=''INSERT'' THEN
-- Conectate con dblink, crea la coneccion
select dblink_connect ("hostaddr=127.0.0.1 port=5432 dbname=BD1 user=postgres password=aaaaa");
-- Usa la conexion

select dblink_exec("INSERT INTO T2 VALUES(NEW.ID,NEW.DESC,NEW.CANTIDAD)");

-- Cierra la conección
select dblink_disconnect();

RETURN NEW;

ELSEIF TG_OP=''DELETE'' THEN
--DELETE FROM T2 WHERE OLD.ID=T2.ID;
RETURN OLD;
ELSEIF TG_OP=''UPDATE'' THEN
--UPDATE T2 SET ID=NEW.ID, DESC=NEW.DESC, CANTIDAD=NEW.CANTIDAD WHERE OLD.ID=T2.ID;
RETURN NEW;
END IF;
END;
'LANGUAGE 'PLPGSQL';

CREATE TRIGGER T_COMBO BEFORE INSERT OR UPDATE OR DELETE ON DB2 FOR EACH ROW EXECUTE PROCEDURE COMBO();
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

RE:DB_LINK

Publicado por Roberto (22 intervenciones) el 12/03/2007 09:26:20
Exactamente cual es el problema.

Creo ver algún problema de sintaxis en tu disparador
Por Ejemplo

-TG_OP='INSERT' (Debe ir con una sola comilla
-.... INSERT INTO T2 -> Si es mayusculas debes entrecomillar los objetos:
INSERT INTO "T2" (COMOLLAS DOBLES) ...... new."ID", NEW."DESC" .....

(Si hubiera una forma de indicar los campos y tablas en mayusculas y sin entrecomillar me interesaría conocer como)

Por lo demas creo que hay que instalar algún paquete o algo en POSTGRESQL.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:DB_LINK

Publicado por Roberto (22 intervenciones) el 12/03/2007 09:39:42
Continuando....
Esta sintaxis se crea correctamente sin error, pero al hacer un insert en la tabla ejemplo mia da este error:

ERROR: function dblink_connect("unknown", "unknown") does not exist
Estado SQL:42883
Sugerencias:No function matches the given name and argument types. You may need to add explicit type casts.
Contexto:PL/pgSQL function "combo" line 5 at SQL statement

> Supongo que el dblink_connect devolverá una referencia a la base de datos externa, para que de alguna manera puedas tener 2 conexiones a bases de datos externas, ¿O solo se puede tener una conexión con dbink?
>El hecho de que la compilación y creación no de errores no implica que este todo correcto. Puede producirse un error en ejecución, como es mi caso. Este error puede ser además de lo supuesto en el otro correo (falta de instalar el dblink), errores de sintaxis por no entrecomillar correctamente o hacer referencia a objetos inexistentes (new.campoinexistente). Esto da error en ejecución no en compilación.
Seguiré investigando el dblink, pues estamos creando un replicación de bases de datos postgres y aunque esta no es la solución, sí tendremos que explicar todas las posibilidades... y esta yo no lo conocia... así pues gracias.

CREATE OR REPLACE FUNCTION COMBO ()
RETURNS TRIGGER AS
$BODY$
BEGIN
IF TG_OP='INSERT' THEN

-- Conectate con dblink, crea la coneccion
select dblink_connect('conexion','dbname=ejemplo user=postgres passwdord=potiRAV host=127.0.0.1');

--select dblink_connect ("hostaddr=127.0.0.1;port=5432;dbname=ejemplo;user=postgres;password=potiRAV");
-- Usa la conexion

select dblink_exec("INSERT INTO T2 VALUES(NEW.ID,NEW.DESC,NEW.CANTIDAD)");

-- Cierra la conección
select dblink_disconnect();
end if;
RETURN NEW;
END
$BODY$
LANGUAGE 'PLPGSQL';

CREATE TRIGGER T_COMBO BEFORE INSERT OR UPDATE OR DELETE ON tabla1 FOR EACH ROW EXECUTE PROCEDURE COMBO();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar