Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Script SQL para actualizar una base de datos (https://www.clubdelphi.com/foros/showthread.php?t=73416)

Young 19-04-2011 23:07:26

Script SQL para actualizar una base de datos
 
Hola amigos.

Me nace la necesidad de actualizar una base de datos de una aplicación, el asunto es que quiero hacerlo mediante un script al estilo de SQL Server, en donde pueda revisar las tablas y campos para poder actualizar (por lo general agregar campos, vistas, procedimientos almacenados o una tabla) .

Este script se descargaría mediante una rutina de actualización de mi aplicación para luego ejecutarla con isql en el equipo.

La pregunta es:

¿Se puede hacer esto con firebird o necesito crear un proceso más engorroso para hacer la actualización?

o pregunto de otra forma:

¿Existe una mejor forma de lograr esto?

Gracias anticipadas.

Casimiro Notevi 20-04-2011 01:26:47

No sé cómo lo haces con la base de datos de la que hablas, pero ten en cuenta que es SQL, o sea, igual, puedes crear un script, obviamente.

Neftali [Germán.Estévez] 20-04-2011 11:26:04

En una empresa en la que trabajaba se hacía algo similar a esto. En cada actualización iba incluído (en tu caso se puede descargar de Internet) los Scripts para actualizar la Base de Datos.
Es decir, cada actualización llevaba su Script.

Al actualizar se comparaba la versión actual con la nueva y se ejecutaban los Scripts necesarios entre las 2 versiones.

Si pasabas de la 1 a la 3, se ejecutaba por orden, el Scrip de la 2 y de la 3.
Quien pasaba de la 2 a la 3, sólo ejecutabla el script de la 3.

El proceso es sencillo, aunque laborioso.

Young 20-04-2011 23:53:41

Creo que encontré la respuesta a la pregunta que NO supe plantear bien... por eso ruego sus disculpas. En el fondo necesitaba saber por ejemplo, si un sentencia if consultando por la existencia de una tabla podia ir fuera de un procedimiento almacenado... la respuesta es no, pero usando EXECUTE BLOCK se soluciona.

Código SQL [-]
SET TERM !! ;
EXECUTE BLOCK AS BEGIN if (not exists(select 1 from rdb$relations where rdb$relation_name = 'EMPLOYEE')) then
      execute statement 'create table employee ( id integer );'; END!! 
SET TERM ; !!


Gracias.

Casimiro Notevi 21-04-2011 00:26:04

Muy interesante, nunca he usado esa posibilidad, ni recuerdo haber leido sobre ella.

Lepe 21-04-2011 01:32:57

Intenta no complicarte mucho la vida, respeta el KISS (Keep It Simple, Stupid).

Muchos de los manejadores de BBDD (IBexpert, flamerobin, etc) pueden ir almacenando los cambios que se le van haciendo a una base de datos con el tiempo, así que, en cada actualización, solo debes pillar ese "log en sql" que va haciendo el manejador y lanzarlo en tu sistema de actualización.

No necesitas comprobar si tal tabla o cual existe, haz las cosas de forma ordenada y sé consecuente, verás que te quitas muchos problemas de en medio. Quiero decir, "si en la versión anterior no existía la tabla empleados, no hay que andar testeando, ya me estoy basando en el número de versión de la BBDD (por ejemplo)".

Saludos y suerte.

Young 21-04-2011 02:30:33

Cita:

Empezado por Lepe (Mensaje 397727)
Intenta no complicarte mucho la vida, respeta el KISS (Keep It Simple, Stupid).

Muchos de los manejadores de BBDD (IBexpert, flamerobin, etc) pueden ir almacenando los cambios que se le van haciendo a una base de datos con el tiempo, así que, en cada actualización, solo debes pillar ese "log en sql" que va haciendo el manejador y lanzarlo en tu sistema de actualización.

No necesitas comprobar si tal tabla o cual existe, haz las cosas de forma ordenada y sé consecuente, verás que te quitas muchos problemas de en medio. Quiero decir, "si en la versión anterior no existía la tabla empleados, no hay que andar testeando, ya me estoy basando en el número de versión de la BBDD (por ejemplo)".

Saludos y suerte.

Tienes toda la razón, esta semana no estoy muy brillante... bueno casi nunca.

Gracias a todos.

guillotmarc 21-04-2011 09:49:03

Cita:

Empezado por Young (Mensaje 397713)
Creo que encontré la respuesta a la pregunta que NO supe plantear bien... por eso ruego sus disculpas. En el fondo necesitaba saber por ejemplo, si un sentencia if consultando por la existencia de una tabla podia ir fuera de un procedimiento almacenado... la respuesta es no, pero usando EXECUTE BLOCK se soluciona.

Código SQL [-]SET TERM !! ; EXECUTE BLOCK AS BEGIN if (not exists(select 1 from rdb$relations where rdb$relation_name = 'EMPLOYEE')) then execute statement 'create table employee ( id integer );'; END!! SET TERM ; !!



Gracias.

Vaya, que interesante. Nunca se me había ocurrido utilizar el EXECUTE BLOCK de esta forma (en realidad nunca utilizo esa sentencia porqué el dbExpress de Delphi 6 no la acepta).

Para las actualizaciones utilizo los Scripts de IBExpert, precisamente porqué tienen extensiones para realizar este tipo de condicionales. Pero si con esta construcción se puede utilizar un Script estándar, aceptado directamente por el motor, mejor que mejor.

Saludos.

Young 21-04-2011 16:35:10

Buenos días, quiero agregar otra interrogante al tema de actualizaciones de la base de datos. Supongamos que esta base de datos la atacan multiples usuarios, ¿es necesario o recomendable tener acceso exclusivo a la base de datos para actualizar algunas tablas, o podemos hacerlo mientras esten en uso?

La verdad que lo he hecho un par de veces mediante flamerobin de modificar una tabla, obviamente encomendándome a todos los santos para no tener algun problema. Alguno con más experiencia en este tema puede comentar al respecto.

Saludos.

Casimiro Notevi 21-04-2011 17:16:15

Es necesario que no exista nadie más conectados a la base de datos, ten en cuenta que puedes estar haciendo modificaciones en tablas que estén usándose en ese momento y entonces no podrá actualizarse. Es lógico, aunque lo permita (que creo que no) no debe hacerse.

rastafarey 26-04-2011 03:33:43

Resp
 
Si la cosa es manual usa ib experte Menu herramientas/database comparer el resto lo hace el solito. Si no es manual ya debes hacerlo mediante codigo.

donald shimoda 26-04-2011 15:19:45

Cita:

Empezado por rastafarey (Mensaje 398019)
Si la cosa es manual usa ib experte Menu herramientas/database comparer el resto lo hace el solito. Si no es manual ya debes hacerlo mediante codigo.


Database comparer tiene sus componentes que te permiten realizar la comparación desde tu aplicación de mantenimiento de base de datos, programaticamente, transparente para el usuario, funciona muy bien.
Prque tienes una aplicación para realizar mantenimiento... verdad? :rolleyes:

rastafarey 08-07-2011 03:50:34

Resp
 
Database comparer. Es una opcion de la aplicacion IBExpert. Eso fue lo que escribi.

donald shimoda 08-07-2011 15:30:32

Cita:

Empezado por rastafarey (Mensaje 405809)
Database comparer. Es una opcion de la aplicacion IBExpert. Eso fue lo que escribi.

Tranquilo campeón... Tambien existe un set de componentes para Delphi muy buenos, database comparer, que permiten que el amigo realice de manera programática estas tareas.


La franja horaria es GMT +2. Ahora son las 23:01:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi