2013-05-07 74 views
5

我可以使用sp_changeobjectowner更改单个表的所有权。更改数据库中所有对象的所有权

如果我想更改数据库中所有对象的所有权,我应该编写一个存储过程来遍历每个对象还是有另一种方式?

UPDATE 我还发现,更改我的用户的默认架构解决了导致我认为需要更改所有对象的所有权的问题。

回答

3

如果您正在寻找改变只是表的拥有者可以使用无证sp_MSforeachtable这样的:

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

如果你真的需要的所有对象,那么你就需要进行迭代。单程(但不是唯一的方法)会是一个光标像这样的:上述

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 

光标是this一个未经测试和修改后的版本。

*注意:游标查询是指一个列表xtypes。请查看this获取完整列表。

+1

我想补充的选择:在S.name = @currentOwner和sysobjects.schema_id **内加入sys.schemas小号= S.schema_id **以防万一并非所有对象都属于旧所有者 – TPAKTOPA 2016-03-28 13:07:30

4

尝试运行此查询,然后只需选择所有结果,并在单独的查询执行

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') 
相关问题