Transferencia de las Estadísticas de SQL Server de una Base de Datos a otra

Crear y Cargar la Tabla de Mapeo

Cuando los objetos como tablas son creados en una nueva base de datos, los objetos probablemente tengan diferentes identificadores con respecto a la base de datos original. Ya que la tabla sysindexes utiliza el identificador (object id) para identificar tablas, es necesario crear una tabla de mapeo que contenga los originales y nuevos objetos identificadores para cada tabla. La tabla siguiente también contiene los userid. Esto puede no ser necesario, pero este conjunto de scripts no ha sido probado en bases de datos donde las tablas tienen dueños diferentes a dbo. Tampoco es necesario tener el nombre de la columna, pero se incluye por conveniencia.

CREATE TABLE [tobjects] ( name sysname , oid int , ouid int , id int , uid int )

Vuelva a la base de datos original, y use el siguiente script para cargar los identificadores de objeto en la tabla de mapeo.

INSERT [sut]..[tobjects] (name, oid, ouid, id, uid)

SELECT o.name, o.id, o.uid, n.id, n.uid

FROM sysobjects o

INNER JOIN [sut]..sysobjects n ON n.name = o.name

WHERE ( OBJECTPROPERTY(o.id, N’IsUserTable’) = 1

 OR OBJECTPROPERTY(o.id, N’IsUserView’) = 1 )

 AND OBJECTPROPERTY(o.id, N’IsMSShipped’) = 0

ORDER BY o.name

Crear una Copia de la Tabla Original Sysindexes

Este paso también es opcional, pero es útil realizar copias permanentes de la tabla sysindexes de la base de datos original a la nueva. El siguiente script crea la tabla con las mismas columnas que la tabla sysindexes.

CREATE TABLE tindexes (

 id int , status int , first binary (6) , indid smallint , root binary(6) ,  minlen smallint ,

 keycnt smallint , groupid smallint , dpages int , reserved int , used int , rowcnt bigint ,

 rowmodctr int , reserved3 tinyint , reserved4 tinyint , xmaxlen smallint ,

 maxirow smallint , OrigFillFactor tinyint , StatVersion tinyint , reserved2 int ,

 FirstIAM binary (6), impid smallint , lockflags smallint , pgmodctr int ,

 keys varbinary (1088), name sysname , statblob image , maxlen int )

GO

Volver  a la base de datos original y cargar la tabla de arriba con una copia de la tabla sysindexes de la base de datos original.

INSERT [sut]..tindexes

(id,status,first,indid,root,minlen,keycnt,groupid,dpages,reserved,used,rowcnt,

 rowmodctr,reserved3,reserved4,xmaxlen,maxirow,OrigFillFactor,StatVersion,

 reserved2,FirstIAM,impid,lockflags,pgmodctr,keys,name,statblob,maxlen,rows)

SELECT

 i.id,status,first,indid,root,minlen,keycnt,groupid,dpages,reserved,used,rowcnt,

 rowmodctr,reserved3,reserved4,xmaxlen,maxirow,OrigFillFactor,StatVersion,

 reserved2,FirstIAM,impid,lockflags,pgmodctr,keys,i.name,statblob,maxlen,rows

FROM sysindexes i

INNER JOIN [sut]..[tobjects] t ON t.oid = i.id

El inner join a la tabla [tobjects] permite que solamente las filas con mapeo apropiado sean transferidas. El identificador del objeto (object id) no es mapeado a la nueva base de datos en este momento. No hay razones específicas para esta elección.

Reconfigurar para Permitir la Actualización de las Tablas del Sistema

Por defecto, actualizaciones directas sobre las tablas del sistema no son permitidas por razones obvias. Los siguientes comandos cambian este seteo. (Generalmente no se recomienda estos cambios, pero para esta aplicación es necesario).

Exec sp_configure ‘allow updates’, 1

RECONFIGURE WITH OVERRIDE

GO

Tenga en cuenta que cualquier procedimiento (store procedure) creada con “allow updates” activado, también tendrá la capacidad de actualizar las tablas del sistema aunque más tarde se desactivado. Es recomendable que “allow updates” sea desactivado rápidamente, y asegurarse que no se puedan crear procedimientos mientras se encuentre activo.

Continues…

Leave a comment

Your email address will not be published.