我可以使用sp_changeobjectowner
更改单个表的所有权。
如果我想更改数据库中所有对象的所有权,我应该编写一个存储过程来迭代每个对象还是有另一种方式?
UPDATE 我还发现,更改用户的默认架构解决了导致我认为需要更改所有对象的所有权的问题。
答案 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以获取完整列表。