miércoles, 24 de junio de 2009

Migrando de MSSQL2000 a PostgreSQL8.3 - Conclusiones

Ya termine la migración!!!!.. pero... hubieron cosas y cositas que resolver en el camino... asi queee... que mejor que compartirlas con uds...

Estas son las cosas que pasaron o que siempre se deben tener en consideración al momento de hacer una migración de este tipo:

  • No olvidar la diferencia de mayusculas minusculas, si desean usar Mayusculas o caracteres no ingleses como la ñ o tildes ponerlo siempre entre comillas (").
  • El driver ODBC no puede capturar resultados de cursores; es decir funciones que devuelven tipos cursor o refcursor. Segun algunos se puede usando tres instrucciones:

  
begin;
select * from tufuncion();
fetch all from "nombre del cursor devuelto";

<<<<Yo no lo pude hacer funcionar en VB6 ni en Delphi, asi que use records, el tiempo ya presionaba mucho.

  • El driver OleDB cuando retorna mas de 8000 registros aprox. se vuelve lento muy lento. ODBC es siempre rapido pero hay que definir el record para retornar valores.
  • En Delphi fue muy muy ineficiente usar OleDB asi que alli solo se uso ODBC.
  • La instruccion "exists" en Postgres es muy lenta, en lo posible se debe evitar su uso; siempre hay una forma de evitarla con lefts joins, right joins y esas cosas.
  • No existe la sentencia TOP en Select's, en MSSQL se hace algo como: SELECT TOP 10 * FROM tutabla, en PostgreSQL seria: SELECT * FROM tutabla LIMIT 10 , dicen que tambien se puede usar el atributo 'maxrows' de CFQUERY, pero nunca lo use y no tengo idea a que se refieren :o).
  • La sentencia LIKE diferencia mayusculas y minusculas en postgresql, se puede solucionar con algo como esto: SELECT * FROM tutabla WHERE LOWER(columna) LIKE '%#LCase(var)#%' (O tambien se puedes usar el operador ILIKE).
  • El operador mas (+) no se usa para concatenar, en su lugar se debe usar la barra doble (||), por ejemplo la instrucción en MSSQL SELECT nombre + ' ' + apellido AS nombrecompleto seria SELECT nombre || ' ' || apellido AS nomobrecompleto , la ultima forma es aceptada tambien en MSSQL.
  • Hay muchas otras funciones tambien que no existen en PLPgSQL, pero no es dificil encontrar sus equivalencias, por ejemplo:


month -> date_part
year -> date_part
convert -> to_char, cast, ::
print -> raise notice
isnull -> coalesce
str -> to_char

  • El uso del tipo decimal desde VB a veces funciona y aveces no, el porque..., no lo se, asi que migramos todos los "decimal" a double precision, el problema es que despues hay que formatear las salidas y entradas a la cantidad de decimales que se necesiten.
  • Es importante tambien saber que la logica de manejo de transacciones en las funciones almacenadas en PostgreSQL es diferente que la de MSSQL con los Procedimientos Almacenados, en MSSQL si queremos controlar la correcta ejecucion de tooodo un store con muchas instrucciones debemos indicar explicitamente que queremos que este store este en una transaccion e ir capturando los codigos de error para hacer un rollback, mientras que en PostgreSQL toda funcion almacenada se ejecuta automaticamente dentro de una transaccion, por lo que si falla nuestra funcion en algun punto se hara un rollback automatico.
Ahora si creo que es todo.. Bytes y espero que esto le sirva a alguien mas....

No hay comentarios:

Publicar un comentario