2010-09-17 9 views
7

J'ai à peu près pas d'expérience avec Enterprise Manager de SQL Server, donc je ne sais pas si cela est encore possibleSQL Server Enterprise Manager - Mass Supprimer des tableaux et changement de propriété des tableaux

Au cours (ou, espérons-risiblement simples!) une importation dans une base de données est arrivée, où chaque table s'est dupliquée avec deux différences importantes. Le premier est que le propriétaire sur les deux tables est différent, le second est que seule la structure a copié sur l'une des copies. La loi de Sod indiquait bien sûr que les données étaient stockées sur les tables détenues par la mauvaise personne, alors ma question est de savoir si je peux rapidement supprimer toutes les tables appartenant à un utilisateur et puis-je changer rapidement la propriété de toutes les autres tables les en ligne.

Il y a assez de tables que l'automatisation va être mon option préférée d'une manière LONGUE!

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

+2

Version de SQL Server? (Je présume 2000 à cause de Enterprise Manager mais juste pour être sûr) –

+0

@Martin, ouais 2000, désolé, je vais modifier mon poste maintenant. – Toby

+0

Ne pas oublier de corriger pourquoi cela est arrivé afin que le problème ne se reproduit pas. J'écris tous les scripts de création spécifiant spécifiquement dbo comme le propriétaire (ou dans les versions plus récentes, le schemawe veut utiliser pour la table). Tous nos devs sont censés faire ceci et cela fait partie de notre revue de code. – HLGEM

Répondre

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 pour une solution complète. –

+0

Cela automatiserait l'ensemble du processus de sélection des tables dupliquées, supprimant la table vide et changeant de propriétaire. Tout ce que vous devez changer est les deux variables Propriétaire en haut. – Fosco

+0

Excellent, merci beaucoup. Avez-vous écrit cela à la volée ou avez-vous déjà dû faire quelque chose de similaire? – Toby

3

Pour changer la propriété, voir: SQL Table Ownership Changes, Quick and Easy

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 
+0

Cela aiderait avec une pièce du puzzle, mais cela n'aide pas à enlever les tables supplémentaires. – Fosco

+0

Comme je l'ai mentionné (dans les trois premiers mots de mon article), cela visait à aborder la partie de la question sur le changement de propriété. Vous avez raison de dire que les mauvaises tables devraient probablement être supprimées en premier. –

+0

Merci beaucoup, m'a sauvé une tonne de temps! – Toby