2013-05-07 4 views
5

Ich kann den Besitz einer einzelnen Tabelle mit sp_changeobjectowner ändern.Besitzrechte für alle Objekte in einer Datenbank ändern

Wenn ich den Besitz aller Objekte in einer Datenbank ändern möchte, sollte ich eine gespeicherte Prozedur schreiben, um jedes Objekt zu durchlaufen oder gibt es einen anderen Weg?

UPDATE Ich fand auch, dass das Standardschema für meinen Benutzer ändert das Problem gelöst, die mich mich brauchte, um Besitzrechte aller Objekte zu denken verursacht wurden.

Antwort

3

Wenn Sie schauen, Besitzer von nur Tabellen ändern Sie die undokumentierte sp_MSforeachtable wie diese verwenden:

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

Wenn Sie wirklich alle Objekte müssen dann werden Sie durchlaufen müssen. Eine Möglichkeit (aber nicht die einzige Möglichkeit) wäre ein Cursor wie diese:

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 

Cursor über eine nicht getestete und modifizierte Version von this.

* Hinweis: Die Cursorabfrage bezieht sich auf eine Liste von xtypes. Bitte überprüfen Sie this für die vollständige Liste.

+1

Ich möchte hinzufügen, wählen in separate Abfrage ausführen: ** Innen sys.schemas S auf S.name = @currentOwner UND sysobjects.schema_id beitreten = S.schema_id ** Falls nicht alle Objekte zum alten Besitzer gehören – TPAKTOPA

4

Diese Abfrage ausgeführt wird und dann nur alle Ergebnisse auswählen und

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') 
Verwandte Themen