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