Replica SQL Server 2005 hacia Postgres

Forums: 

Estimados amigos, en donde trabajo requiero lograr la replicacion entre SQL Server (publicador, distribuidor) y Postgres (suscriptor).

La configuracion ha sido creada con exito, pero, al momento de replicar, SQL Server crea una tabla llamada "MSREPL7" y lo hace cada vez que se inicia el agente de replica, de manera que en Postgres el LOG muestra el error:

COT ERROR: operator does not exist: character = integer at character 98
COT HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
COT STATEMENT: select xactts, subguid from "MSREPL7" where pubsrv = 'DEBRIAN' and pubdb = 'prueba' and indagent = 0 and subtype = 0

COT STATEMENT: create table "MSREPL7" (pubsrv char (128), pubdb char (128), publcn char (128), indagent char,subtype int4, dstagent char (100),timecol timestamptz,descr char (255), xactts bytea, updmode int2, agentid bytea, subguid bytea, subid bytea, immsync char)

COT ERROR: relation "MSREPL7" already exists

He detectado que la tabla "MSREPL7" debe tener la columna "indagent" como integer, he realizado el ajuste, pero el agente sigue intentando crear la tabla una y otra vez.

Si alguien ha podido exitaosamente hacer este milagrito le agradeceria infinitamente cualquier sugerencia o comentario.

Gracias de antemano.

Errores replica SQL Server 2005 hacia Postgres

Saludos,

Aunque nunca he intentado lo que dices te dire lo que veo aqui, en realidad te esta dando dos errores independientes.

el 1ro
[quote]
COT ERROR: operator does not exist: character = integer at character 98
COT HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
COT STATEMENT: select xactts, subguid from "MSREPL7" where pubsrv = 'DEBRIAN' and pubdb = 'prueba' and indagent = 0 and subtype = 0
[/quote]

este es facil, esta ejecutando un select en una tabla y pregunta por "indagent = 0" pero indagent es un campo char mientras que el numero como ya te habras dado cuenta no lo es ;)

postgres desecho esos casts implicitos desde la version 8.3 (por buenas razones)

la solucion correcta seria arreglar la aplicacion, pero como la aplicacion proviene de m$ eso quiza sea imposible. asi que la otra opcion que te queda es crear el cast que necesitas (el resto de los casts esta en: http://petereisentraut.blogspot.com/2008/03/readding-implicit-casts-in-postgresql.html)

CREATE FUNCTION pg_catalog.text(integer) RETURNS text STRICT IMMUTABLE LANGUAGE SQL AS 'SELECT textin(int4out($1));';
CREATE CAST (integer AS text) WITH FUNCTION pg_catalog.text(integer) AS IMPLICIT;

ten presente que *no* deberias crear estos casts a menos que en realidad los necesites y que cada vez que debas reinstalar postgres deberas volver a crearlos asi que guarda los que creas en algun lugar donde no lo pierdas

el 2do
[quote]
COT STATEMENT: create table "MSREPL7" (pubsrv char (128), pubdb char (128), publcn char (128), indagent char,subtype int4, dstagent char (100),timecol timestamptz,descr char (255), xactts bytea, updmode int2, agentid bytea, subguid bytea, subid bytea, immsync char)
COT ERROR: relation "MSREPL7" already exists
[/quote]

aqui esta tratando de crear la tabla, supongo que al dar el error supone que la tabla no existe (en que mente!!! un error es un error y no se debe ignorar simplemente... tipico de m$)

Jaime Casanova
www.2ndQuadrant.com

He creado todos los casts

Imagen de yahuar_kuntur

He creado todos los casts implicitos de

http://petereisentraut.blogspot.com/2008/03/readding-implicit-casts-in-postgresql.html

La replica se crea inicialmente, pero posteriores intentos de sincronizacion dan el mismo error en SQL Server sobre la bendita tabla que ya existe...

Alguna idea???

Saludos,

ahm! podemos ver los errores?

ahm! podemos ver los errores? por cierto, posiblemente te convendria escribir a pgsql-es-ayuda@postgresql.org es mas facil que vea tus respuestas ahi... hace poco recien entendi que en Ecualug puedo subscribirme a un hilo, por eso vi tu comentario, que sino no lo hubiera visto hasta el domingo o la proxima semana

Jaime Casanova
www.2ndQuadrant.com

Y bueno... el error es el

Imagen de yahuar_kuntur

Y bueno... el error es el mismo...


ECT ERROR: la relación «MSREPL7» ya existe
ECT SENTENCIA: create table "MSREPL7" (pubsrv char (128), pubdb char (128), publcn char (128), indagent char,subtype int4, dstagent char (100),timecol timestamptz,descr char (255), xactts bytea, updmode int2, agentid bytea, subguid bytea, subid bytea, immsync char)

Luego de eso se detiene por completo la replica y no syncroniza nada :(

Saludos,

primero entendamos el

primero entendamos el problema antes de ignorarlo, ademas cuando ejecutarias el script? por ejemplo (hablo por pura ignorancia, no se como funciona la replica de m$sql) si la replica es en linea el script deberia ejecutarse cada 5 minutos? cada hora?

mas bien si usas odbc para conectarte de m$sql a postgres en el odbc hay una caja de texto para ingresar una sentencia que se ejecute al establecer la conexion (ahi podrias poner el drop) pero primero lo primero

Jaime Casanova
www.2ndQuadrant.com

¡que raro! sigue intentando

¡que raro! sigue intentando crear la tabla?
se me ocurre cual puede ser el problema pero para confirmarlo haz esto:
verifica que el log este redireccionado a un archivo: log_destination=stderr y logging_collector=on

si tuviste que hacer ese cambio debes reiniciar el servicio: pg_ctl -D /ruta/al/data restart

luego pon log_statement = 'all' y recarga la configuracion: pg_ctl -D /ruta/al/data reload
intenta la replica otra vez y regresa log_statement = 'none' o en lo que estuviera antes y recarga la configuracion.

Luego fijate en el error y busca lineas mas arriba si hay una consulta al catalogo pg_class buscando esa tabla, si existe muestrame esa consulta

Jaime Casanova
www.2ndQuadrant.com