Procedimeinto para actualizar bases de datos

31/01/2008 - 19:28 por Rony De Sousa | Informe spam
Hola que tal!

El asunto es el siguiente, tengo una aplicación cuya BD está en SQL Server
2000, como el sistema está en pleno desarrollo constantemente hay cambios
sobre la base de datos, tablas y campos nuevos, restricciones primary key,
default etc...
Entonces debo actualizar las bases de datos que están en los equipos de los
clientes con la versión más actual, actualmente lo que hago es que por cada
modificación genero un script, por ejemplo:
Alter table tabla Altercolumn...
pero necesito encontrar una manera de hacer esto de forma más fácil o más
automática, he pensado en tener en mi lugar de desarrollo una especie de base
de datso "plantilla" y luego posteriormente esta base de datos plantilla
usarla como base para compararla con la de los clientes, para esto debería
crear algo más o menos asi:

declare @NombTabla as varchar(80), @Cmd as varchar(8000), @NombCampo as
varchar(80)
set @NombTabla = ''
set @NombCampo = ''
set @Cmd = ''

Declare cur_tablas cursor
for Select Distinct so.name
From sysobjects so inner Join SysColumns sc On so.id = sc.id
where so.xtype = 'U' order by so.name

open cur_tablas
fetch next from cur_tablas
into @NombTabla

while @@fetch_status = 0
begin

Declare cur_campos_tablas cursor
for Select sc.name
From sysobjects so inner Join SysColumns sc On so.id = sc.id
where so.xtype = 'U' And so.name = @NombTabla order by so.name

open cur_campos_tablas
fetch next from cur_campos_tablas
into @NombCampo

while @@fetch_status = 0
begin
set @Cmd = 'If Not Exists(Select sc.name From SysColumns sc Inner Join
SysObjects so On sc.id = so.id ' + Char(13)
set @Cmd = @Cmd + ' Where so.name = ' +
Char(39) + @NombTabla + Char(39) + ' And sc.name = ' + Char(39) + @NombCampo
+ Char(39) + ')' + Char(13)
set @Cmd = @Cmd + 'Begin' + Char(13)
set @Cmd = @Cmd + ' Alter Table ' + @NombTabla + +
Char(13)
set @Cmd = @Cmd + ' Alter Column ' + @NombCampo + '
[char] (5) NOT NULL' + Char(13)
set @Cmd = @Cmd + 'End' + Char(13)
set @Cmd = @Cmd + 'Else' + Char(13)
set @Cmd = @Cmd + 'Begin' + Char(13)
set @Cmd = @Cmd + ' Alter Table ' + @NombTabla + +
Char(13)
set @Cmd = @Cmd + ' Add ' + @NombCampo + ' [char] (5)
NOT NULL' + Char(13)
set @Cmd = @Cmd + 'End'

print @Cmd
set @Cmd = ''
fetch next from cur_campos_tablas
into @NombCampo
end

close cur_campos_tablas
deallocate cur_campos_tablas

fetch next from cur_tablas
into @NombTabla
End

close cur_tablas
deallocate cur_tablas


Obviamente falta mucho código aún.. pero, alguna idea de como podría hacer
esto más facilmente? No se, crear un respaldo de la estructura de mi base de
datos plantilla y luego montar este respaldo sobre la base de datos de los
clientes (solo estructura)?

Gracias de antemano por su timepo!

Preguntas similare

Leer las respuestas

#1 Gux (MVP)
31/01/2008 - 19:45 | Informe spam
Visual Studio for Database Professional dispone de herramientas para comparar
y sincronizar esquemas de bases de datos.

Pero antes de que existiera, el camino era aplicar scripts :-)

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Rony De Sousa" wrote:

Hola que tal!

El asunto es el siguiente, tengo una aplicación cuya BD está en SQL Server
2000, como el sistema está en pleno desarrollo constantemente hay cambios
sobre la base de datos, tablas y campos nuevos, restricciones primary key,
default etc...
Entonces debo actualizar las bases de datos que están en los equipos de los
clientes con la versión más actual, actualmente lo que hago es que por cada
modificación genero un script, por ejemplo:
Alter table tabla Altercolumn...
pero necesito encontrar una manera de hacer esto de forma más fácil o más
automática, he pensado en tener en mi lugar de desarrollo una especie de base
de datso "plantilla" y luego posteriormente esta base de datos plantilla
usarla como base para compararla con la de los clientes, para esto debería
crear algo más o menos asi:

declare @NombTabla as varchar(80), @Cmd as varchar(8000), @NombCampo as
varchar(80)
set @NombTabla = ''
set @NombCampo = ''
set @Cmd = ''

Declare cur_tablas cursor
for Select Distinct so.name
From sysobjects so inner Join SysColumns sc On so.id = sc.id
where so.xtype = 'U' order by so.name

open cur_tablas
fetch next from cur_tablas
into @NombTabla

while @@fetch_status = 0
begin

Declare cur_campos_tablas cursor
for Select sc.name
From sysobjects so inner Join SysColumns sc On so.id = sc.id
where so.xtype = 'U' And so.name = @NombTabla order by so.name

open cur_campos_tablas
fetch next from cur_campos_tablas
into @NombCampo

while @@fetch_status = 0
begin
set @Cmd = 'If Not Exists(Select sc.name From SysColumns sc Inner Join
SysObjects so On sc.id = so.id ' + Char(13)
set @Cmd = @Cmd + ' Where so.name = ' +
Char(39) + @NombTabla + Char(39) + ' And sc.name = ' + Char(39) + @NombCampo
+ Char(39) + ')' + Char(13)
set @Cmd = @Cmd + 'Begin' + Char(13)
set @Cmd = @Cmd + ' Alter Table ' + @NombTabla + +
Char(13)
set @Cmd = @Cmd + ' Alter Column ' + @NombCampo + '
[char] (5) NOT NULL' + Char(13)
set @Cmd = @Cmd + 'End' + Char(13)
set @Cmd = @Cmd + 'Else' + Char(13)
set @Cmd = @Cmd + 'Begin' + Char(13)
set @Cmd = @Cmd + ' Alter Table ' + @NombTabla + +
Char(13)
set @Cmd = @Cmd + ' Add ' + @NombCampo + ' [char] (5)
NOT NULL' + Char(13)
set @Cmd = @Cmd + 'End'

print @Cmd
set @Cmd = ''
fetch next from cur_campos_tablas
into @NombCampo
end

close cur_campos_tablas
deallocate cur_campos_tablas

fetch next from cur_tablas
into @NombTabla
End

close cur_tablas
deallocate cur_tablas


Obviamente falta mucho código aún.. pero, alguna idea de como podría hacer
esto más facilmente? No se, crear un respaldo de la estructura de mi base de
datos plantilla y luego montar este respaldo sobre la base de datos de los
clientes (solo estructura)?

Gracias de antemano por su timepo!
Respuesta Responder a este mensaje
#2 Rony De Sousa
31/01/2008 - 20:16 | Informe spam
Gracias por tu pronta respuesta amigo!

Osea que mi idea de los script no es tan loca? jeje
Lo que pienso hacer es ir recorriendo en primer lugar las tablas para
verificar si hay nuevas creadas y de ser así pues crearlas en la base de
datos del cliente y luego iría recorriendo cada campo de cada tabla para
verificar tipos de datos, campos nuevos etc.. ¿No es esto algo descabellado?
o mejor dicho no es una manera muy ineficiente de hacerlo?

Y otra detallito mas, :) en el caso de los procedimeintos almacenados
actualmente genero la secuencia de comandos de todos los procedimientos (con
el drop por si existen y luego create), y ese archivo .sql tal cual como me
lo genera sql server asi lo uso para actualizar los procedimientos, pero, no
es algo un poco "arriesgado"?
Lo digo porque tengo muuchos procedimeintos y el scrip me ocupa más de
220.000 líneas, no hay riesgo de que al intentar abrir el archivo desde el
analizador de consultas este no pueda abrir el bien el archivo, osea, de
manera correcta? Lo digo por la cantidad de líneas que tiene el mismo.

Agradezco me puedan seguir orientando y disculpen si lo que pregunto les
parece algo muy básico.

Gracias de nuevo y saluos!



"Gux (MVP)" wrote:

Visual Studio for Database Professional dispone de herramientas para comparar
y sincronizar esquemas de bases de datos.

Pero antes de que existiera, el camino era aplicar scripts :-)

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida