Seguramente muchas veces nos hemos encontrado duplicando procedimientos, vistas, etc. a lo largo de varias bases de datos de un mismo servidor. Esto puede producirse por ejemplo cuando tenemos un conjunto de procedimientos “útiles” que reutilizamos en diferentes bases de datos.
- Scriptaremos desde Management Studio todos los procedimientos de la base de datos de la aplicación y los recrearemos en la base de datos master.
- Renombraremos todos estos procedimientos con el prefijo sp_ y los marcaremos como procedimientos de sistema
- Renombraremos los procedimientos en la base de datos de la aplicación.
- Crearemos sinónimos para todos los nuevos procedimientos sp_XXX (definidos ahora en la base de datos master) para que tengan el mismo nombre que los originales. El uso de sinónimos es nuevo en 2005 y nos añade un nivel extra de flexibilidad al permitirnos referenciar objetos con otro nombre potencialmente más sencillo.
- Revisaremos permisos. Tenemos que tener en cuenta que el sinónimo hará referencia al procedimiento en la base de datos master y deberemos dar permisos de ejecución tanto al sinónimo como al procedimiento correspondientes de master para poder ejecutarlo.
use master
declare @database nvarchar(max)
declare @name nvarchar(max)
declare @newname nvarchar(max)
declare @sql nvarchar(max)
declare cur cursor for
select o.name from sys.objects o
join sys.schemas s on o.schema_id=s.schema_id
where type=‘P’
and o.name not like ‘sp%’ — Ajustar para devolver los procedimientos correspondientes
and s.name = ‘dbo’ — Ajustar para devolver los procedimientos correspondientes
set @database=‘nuestrabasededatos’ — El nombre de la base de datos de la que migramos los procedimientos
open cur
fetch next from cur into @name
while @@fetch_status=0
begin
set @newname=replace(@name,‘.’,‘.sp’)
select @name,@newname
exec sp_rename @name, @newname
EXEC sys.sp_MS_marksystemobject @newname
set @sql= ‘use ‘ + @database +‘; exec sp_rename ”’ + @name + ”’ ,”’ + @name+‘_borrar’ +”’ ; create synonym ‘ + @name + ‘ for ‘ + @newname
select @sql
EXECUTE sp_executesql @sql
fetch next from cur into @name
end
close cur
deallocate cur
Debemos tener en cuenta que no existen soluciónes únicas y que no siempre son aplicables. Hoy en día existen también otras formas de mantener esta coherencia de objetos de bases de datos. Por ejemplo manteniendo un repositorio en SourceSafe y sincronizando éste contra cada base de datos con Visual Studio 2005 Team Edition for Database Professionals.