Pregunta

Me tiene casi ninguna experiencia con el Administrador corporativo de SQL Server así que no estoy seguro de si esto es posible (o con suerte ridículamente simple!)

Durante una importación en una base de datos algo ha sucedido en cada mesa se ha duplicado en sí con dos diferencias importantes.

La primera es que el propietario de ambas tablas es diferente, la segunda es que sólo la estructura ha copiado a través de una de las copias.

La ley de Sod indicó que, por supuesto, los datos se almacenan en las tablas de propiedad de la persona equivocada, por lo que mi pregunta es puedo Rápidamente eliminar todas las tablas propiedad de un usuario y puedo cambiar rápidamente la propiedad de todas las otras tablas para traerlos en la cola.

Hay suficientes mesas que la automatización va a ser mi opción preferida por un largo camino!

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

¿Fue útil?

Solución

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

Otros consejos

Para el cambio de propiedad, ver: SQL Tabla Propietario de cambios, rápido y Fácil

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top