更改数据库中所有对象的所有权

时间:2013-05-07 23:09:05

标签: sql-server

我可以使用sp_changeobjectowner更改单个表的所有权。

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

如果您想要更改仅表的所有者,可以使用未记录的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以获取完整列表。