2010-09-17 8 views
7

mam prawie żadnego doświadczenia z SQL Server Enterprise Manager, więc nie jestem pewien, czy jest to w ogóle możliweSQL Server Enterprise Manager - Mass Usuwanie tabel i zmiana własnościowa tabelach

podczas (lub z nadzieją śmiesznie proste!) import do bazy danych coś się stało, gdy każda tabela powiela się z dwiema ważnymi różnicami.

Po pierwsze, Właściciel na obu stołach jest inny, po drugie tylko jedna struktura została skopiowana na jednej z kopii.

Prawo Sod wskazywało, że dane były przechowywane na stołach należących do niewłaściwej osoby, więc mogę szybko usunąć wszystkie tabele należące do jednego użytkownika i mogę szybko zmienić prawo własności wszystkich innych tabel, aby je w linii.

Jest wystarczająco dużo stołów, że automatyzacja będzie moją preferowaną opcją w DŁUGIM sposób!

Każda pomoc będzie mile widziana, używam programu SQL Server 2000

+2

Wersja programu SQL Server? (Przypuszczam, że 2000 z powodu Enterprise Managera, ale po prostu dla pewności) –

+0

@Martin, yeah 2000, przepraszam, będę edytować mój post teraz. – Toby

+0

Nie zapomnij ustalić, dlaczego tak się stało, więc problem się nie odtwarza. Piszę wszystkie skrypty kreacji określające specyficznie dbo jako właściciela (lub w nowszych wersjach, których schemat chce użyć dla tabeli). Oczekuje się, że wszyscy nasi deweloperzy zrobią to i jest to część naszego sprawdzania poprawności kodu. – HLGEM

Odpowiedz

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 za kompleksowe rozwiązanie. –

+0

To zautomatyzuje cały proces wyboru zduplikowanych tabel, upuszczając pustą tabelę i zmieniając prawo własności. Wszystko, co musisz zmienić, to dwie zmienne właściciela u góry. – Fosco

+0

Doskonale, dziękuję bardzo. Pisałeś to w locie, czy musiałeś wcześniej zrobić coś podobnego? – Toby

3

Do zmiany własności, patrz: SQL Table Ownership Changes, Quick and Easy

Kod podane w powyższym linku jest:

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

Pomoże to w przypadku jednego elementu układanki, ale nie pomoże usunąć dodatkowych tabel. Zmieniłoby to również właściciela wszystkich tabel, a nie tylko ich duplikatów (choć może to być ok.). – Fosco

+0

Jak już wspomniałem (w pierwszych 3 słowach mojego wpisu), miało to na celu zmianę części własności dotyczącej pytania. Masz rację, że złe tabele powinny zostać najpierw usunięte. –

+0

Wielkie dzięki, zaoszczędziło mnie mnóstwo czasu! – Toby

Powiązane problemy