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!
 

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!

Preguntas similares