2013-05-07 10 views
5

Posso modificare la proprietà di una singola tabella utilizzando sp_changeobjectowner.Modifica della proprietà di tutti gli oggetti in un database

Se voglio modificare la proprietà di tutti gli oggetti in un database, dovrei scrivere una stored procedure per scorrere ogni oggetto o c'è un altro modo?

UPDATE Ho anche scoperto che la modifica dello schema predefinito per il mio utente ha risolto il problema che mi causava la necessità di cambiare la proprietà di tutti gli oggetti.

risposta

3

se si sta cercando di cambiare i proprietari di pochi tavoli è possibile utilizzare la non documentata sp_MSforeachtable in questo modo:

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

Se davvero bisogno di tutti gli oggetti, allora avrete bisogno di iterare. Una direzione (ma non l'unico) sarebbe un cursore come questo:

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 

cursore sopra è una versione modificata di testata e this.

* Nota: la query del cursore fa riferimento a un elenco di xtypes. Si prega di rivedere this per l'elenco completo.

+1

vorrei aggiungere per selezionare: unirsi ** interno sys.schemas S sul S.name = @currentOwner E sysobjects.schema_id = S.schema_id ** nel caso, non tutti gli oggetti appartengono al vecchio proprietario – TPAKTOPA

4

Provare a eseguire questa query e poi basta selezionare tutti i risultati ed eseguire query separata in

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') 
Problemi correlati