6

我可以使用sp_changeobjectowner.

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

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

4

2 回答 2

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')
于 2013-05-08T09:16:07.910 回答
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. 请查看以获取完整列表。

于 2013-05-08T06:54:34.653 回答