2013-05-07 14 views
5

Mogę zmienić właściciela pojedynczej tabeli przy użyciu sp_changeobjectowner.Zmiana właściciela wszystkich obiektów w bazie danych

Jeśli chcę zmienić własność wszystkich obiektów w bazie danych, czy powinienem napisać procedurę przechowywaną, aby przejrzeć każdy obiekt lub czy istnieje inny sposób?

AKTUALIZACJA Odkryłem także, że zmiana domyślnego schematu dla mojego użytkownika rozwiązała problem, który powodował, że musiałem zmienić właściciela wszystkich obiektów.

Odpowiedz

3

Jeśli szukasz zmienić właścicieli zaledwie tabel można użyć nieudokumentowane sp_MSforeachtable takiego:

sp_MSforeachtable @command1="sp_changeobjectowner '?', 'new_owner'" 

Jeśli naprawdę potrzebujemy wszystkich obiektów to musisz iteracyjne. Jednym ze sposobów (ale nie jedyny sposób) będzie kursor jak ten:

DECLARE @currentObject nvarchar(517) 
DECLARE @qualifiedObject nvarchar(517) 
DECLARE @currentOwner varchar(50) 
DECLARE @newOwner varchar(50) 

SET @currentOwner = 'ASPNET' 
SET @newOwner = 'dbo' 

DECLARE alterOwnerCursor CURSOR FOR 
SELECT [name] FROM dbo.sysobjects 
WHERE 
    xtype in ('FN','IF','P','TF','U','V', 'TT', 'TF') --Modify list to add and remove object types* 
OPEN alterOwnerCursor 
FETCH NEXT FROM alterOwnerCursor INTO @currentObject 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @qualifiedObject = CAST(@currentOwner as varchar) + '.' + CAST(@currentObject as varchar) 
    EXEC sp_changeobjectowner @qualifiedObject, @newOwner 
    FETCH NEXT FROM alterOwnerCursor INTO @currentObject 
END 
CLOSE alterOwnerCursor 
DEALLOCATE alterOwnerCursor 

Kursor powyżej jest niesprawdzone i zmodyfikowana wersja this.

* Uwaga: Zapytanie kursora odnosi się do listy xtypes. Przejrzyj this dla pełnej listy.

+1

Dodałbym do wyboru: ** wewnętrzna przyłączyć sys.schemas S na S.name = @currentOwner I sysobjects.schema_id = S.schema_id ** w przypadku, nie wszystkie obiekty należą do starego właściciela – TPAKTOPA

4

Spróbuj uruchomić tę kwerendę, a następnie po prostu zaznaczyć wszystkie wyniki i wykonać w osobnym zapytaniu

select 'EXEC sp_changeobjectowner ''' + S.name + '.' + O.name + '' + ''', ''new_owner''' 
from sys.all_objects O 
inner join sys.schemas S 
on O.schema_id = S.schema_id 
where O.type in ('FN','IF','P','TF','U','V', 'TT', 'TF') 
Powiązane problemy