Question

J'ai à peu près pas d'expérience avec Enterprise Manager de SQL Server, donc je ne sais pas si cela est encore possible (ou je l'espère risiblement est simple!)

Lors d'une importation dans une base de données est arrivé quelque chose où chaque table elle-même a dupliqué avec deux différences importantes.

La première est que le titulaire sur les deux tables est différente, la deuxième est que seule la structure a copié à travers sur l'une des copies.

La loi de Sod a indiqué que bien sûr les données ont été stockées sur les tables appartenant à la mauvaise personne, donc ma question est puis-je supprimer rapidement toutes les tables appartenant à un utilisateur et puis-je changer rapidement la propriété de toutes les autres tables pour les amener en ligne.

Il y a assez de tables que l'automatisation va être mon option préférée par un long chemin!

Toute aide serait grandement appréciée, je suis en cours d'exécution SQL Server 2000

Était-ce utile?

La solution

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

Autres conseils

Pour changer la propriété, voir: Table SQL changement de propriété, rapide et facile

Le code donné dans le lien ci-dessus est:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top