我可以使用sp_changeobjectowner
.
如果我想更改数据库中所有对象的所有权,我应该编写一个存储过程来遍历每个对象还是有其他方法?
更新我还发现为我的用户更改默认架构解决了导致我认为我需要更改所有对象的所有权的问题。
我可以使用sp_changeobjectowner
.
如果我想更改数据库中所有对象的所有权,我应该编写一个存储过程来遍历每个对象还是有其他方法?
更新我还发现为我的用户更改默认架构解决了导致我认为我需要更改所有对象的所有权的问题。
尝试运行此查询,然后选择所有结果并在单独的查询中执行
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')
如果您想更改表的所有者,您可以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
. 请查看此以获取完整列表。