2010-09-17 15 views
7

tengo casi ninguna experiencia con el Administrador corporativo de SQL Server así que no estoy seguro de si esto es posibleSQL Server Enterprise Manager - Masa Eliminar de tablas y cambio de propiedad de las Tablas

Durante (o con suerte ridículamente simple!) una importación a una base de datos ha sucedido algo donde cada tabla se ha duplicado con dos diferencias importantes.

La primera es que el propietario en ambas tablas es diferente, el segundo es que solo la estructura ha copiado en una de las copias.

La ley de Sod indicó que, por supuesto, los datos estaban almacenados en las tablas propiedad de la persona equivocada, entonces mi pregunta es ¿puedo eliminar rápidamente todas las tablas propiedad de un usuario y puedo cambiar rápidamente la propiedad de todas las demás tablas para traerlas? ellos en línea.

¡Hay suficientes tablas para que la automatización sea mi opción preferida de una manera LARGA!

Cualquier ayuda sería muy apreciada, estoy ejecutando SQL Server 2000

+2

Versión de SQL Server? (Estoy presumiendo 2000 debido a Enterprise Manager pero solo para estar seguro) –

+0

@Martin, sí 2000, lo siento, voy a editar mi publicación ahora. – Toby

+0

No se olvide de corregir por qué sucedió esto para que el problema no se vuelva a crear. Escribo todos los scripts de creación especificando dbo como el propietario (o en las versiones más nuevas, el esquema que queremos usar para la tabla). Se espera que todos nuestros desarrolladores hagan esto y es parte de nuestro proceso de revisión del código verificarlo. – HLGEM

Respuesta

5
declare @emptyOwner varchar(20) 
declare @wrongOwner varchar(20) 
declare @emptyOwnerID bigint 
declare @wrongOwnerID bigint 
declare @tableName nvarchar(255) 

set @emptyOwner = 'dbo' 
set @wrongOwner = 'guest' 

select @emptyOwnerID = (select uid from sysusers where name = @emptyOwner) 
select @wrongOwnerID = (select uid from sysusers where name = @wrongOwner) 

select name as tableName 
into #tempTable 
from systables 
where type='U' 
and exists (select 1 from systables where type = 'U' and uid = @emptyOwnerID) 
and exists (select 1 from systables where type = 'U' and uid = @wrongOwnerID) 

declare @dynSQL nvarchar(MAX) 

declare ownme cursor for 
 select tableName from #tempTable 

open ownme 
fetch next from ownme into @tableName 

while @@FETCH_STATUS = 0 
begin 
   @dynSQL = 'DROP TABLE [' + @emptyOwner + '].[' + @tableName + ']' 
   exec(@dynSQL) 

   @dynSQL = 'sp_changeobjectowner ''[' + @wrongOwner + '].[' + @tableName + ']'',''' + @emptyOwner + '''' 
   exec(@dynSQL) 

   fetch next from ownme into @tableName 
end 

close ownme 
deallocate ownme 
+1

+1 para una solución integral. –

+0

Esto automatizaría todo el proceso de selección de las tablas duplicadas, eliminando la tabla que está vacía y cambiando la propiedad. Todo lo que debe cambiar es las dos variables de Propietario en la parte superior. – Fosco

+0

Excelente, muchas gracias. ¿Escribiste eso sobre la marcha o has tenido que hacer algo similar antes? – Toby

3

Para cambiar la propiedad, ver: SQL Table Ownership Changes, Quick and Easy

El código dado en el enlace anterior es:

DECLARE @old sysname, @new sysname, @sql varchar(1000) 

SELECT 
    @old = 'oldOwner_CHANGE_THIS' 
    , @new = 'dbo' 
    , @sql = ' 
    IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES 
    WHERE 
     QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?'' 
     AND TABLE_SCHEMA = ''' + @old + ''' 
) 
    EXECUTE sp_changeobjectowner ''?'', ''' + @new + '''' 

EXECUTE sp_MSforeachtable @sql 
+0

Esto ayudaría con una pieza del rompecabezas, pero no ayuda a eliminar las tablas adicionales. También esto cambiaría la propiedad de todas las tablas, no solo de las duplicadas (aunque eso podría estar bien). – Fosco

+0

Como mencioné (en las primeras 3 palabras de mi publicación), esto tenía como objetivo abordar la parte del cambio de propiedad de la pregunta. Tiene razón en que las tablas incorrectas probablemente deberían descartarse primero. –

+0

¡Muchas gracias, me han ahorrado una tonelada de tiempo! – Toby

Cuestiones relacionadas