2010-09-17 13 views
7

ho praticamente alcuna esperienza con Enterprise Manager di SQL Server in modo non sono sicuro se questo è ancora possibileSQL Server Enterprise Manager - Eliminazione di massa delle tabelle e modifica proprietà delle tabelle

Durante (o si spera ridicolmente semplice!) un'importazione in un database è successo qualcosa in cui ogni tabella si è duplicata con due importanti differenze.

Il primo è che il proprietario su entrambe le tabelle è diverso, il secondo è che solo la struttura è stata copiata su una delle copie.

legge di Sod ha indicato che, naturalmente, i dati sono stati memorizzati sui tavoli di proprietà della persona sbagliata, quindi la mia domanda è: posso rapidamente eliminare tutte le tabelle di proprietà di un utente e posso cambiare rapidamente la proprietà di tutte le altre tabelle per portare loro in fila.

Ci sono abbastanza tabelle che l'automazione sarà la mia opzione preferita da un modo LUNGO!

Qualsiasi aiuto sarebbe molto apprezzato, io sono in esecuzione SQL Server 2000

+2

Versione di SQL Server? (Sto presumendo il 2000 a causa di Enterprise Manager, ma solo per essere sicuro) –

+0

@Martin, sì 2000, mi dispiace, ora modificherò il mio post. – Toby

+0

Don; t dimenticare di risolvere il motivo per cui è successo così il problema non si ricrea da solo. Scrivo tutti gli script di creazione specificando specificatamente dbo come proprietario (o nelle versioni più recenti, lo schema che vogliamo utilizzare per la tabella). Ci si aspetta che tutti i nostri sviluppatori lo facciano e fa parte del nostro codice di revisione da esaminare. – HLGEM

risposta

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 per una soluzione completa. –

+0

Ciò automatizza l'intero processo di selezione delle tabelle duplicate, lasciando cadere la tabella vuota e modificando la proprietà. Tutto quello che dovresti cambiare sono le due variabili Owner in alto. – Fosco

+0

Eccellente, grazie mille. L'hai scritto al volo o hai dovuto fare una cosa simile prima? – Toby

3

Per cambiare proprietà, vedi: SQL Table Ownership Changes, Quick and Easy

Il codice dato nel link qui sopra è:

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

Ciò aiuterebbe con un pezzo del puzzle, ma non aiuta a rimuovere i tavoli aggiuntivi. Anche questo cambierebbe la proprietà di tutte le tabelle, non solo quelle duplicate (anche se potrebbe essere ok). – Fosco

+0

Come ho già detto (nelle prime 3 parole del mio post), si intendeva affrontare il cambio di proprietà della domanda. Sei corretto che le cattive tabelle dovrebbero probabilmente essere eliminate prima. –

+0

Grazie mille, mi ha risparmiato una tonnellata di tempo! – Toby

Problemi correlati