SQL Server2005可以使用系統存儲過程sp_changeobjectowner更改數據庫對象的所有者。
sp_changeobjectowner 用於更改當前數據庫中對象的所有者。
sp_changeobjectowner '對象名(包括架構名)','新架構名'
語法
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
參數
[@objname =] 'object'
當前數據庫中現有的表、視圖或存儲過程的名稱。object 的數據類型為 nvarchar(517),沒有默認值。object 可用現有對象所有者限定,格式為 existing_owner.object。
[@newowner =] 'owner'
即將成為對象的新所有者的安全帳戶的名稱。owner 的數據類型為 sysname,沒有默認值。owner 必須是當前數據庫中有效的 Microsoft® SQL Server™ 用戶或角色或 Microsoft Windows NT® 用戶或組。指定 Windows NT 用戶或組時,請指定 Windows NT 用戶或組在數據庫中已知的名稱(用 sp_grantdbAccess 添加)。
返回代碼值
0(成功)或 1(失敗)
注釋
對象所有者(或擁有對象的組或角色的成員)對對象有特殊的權限。對象所有者可以執行任何與對象有關的 Transact-SQL 語句(例如 INSERT、UPDATE、DELETE、SELECT 或 EXECUTE),也可以管理對象的權限。
如果擁有對象的安全帳戶必須要除去,但同時要保留該對象,請使用 sp_changeobjectowner 更改對象所有者。該過程從對象中刪除所有現有權限。在運行 sp_changeobjectowner 之後,需要重新應用要保留的任何權限。
由於這個原因,建議在運行 sp_changeobjectowner 之前,編寫現有權限的腳本。一旦更改了對象的所有權,可能要使用該腳本重新應用權限。在運行該腳本之前需要在權限腳本中修改對象所有者。有關編寫數據庫腳本的更多信息,請參見編寫數據庫文檔和腳本。
批量修改請用:
方法一:使用游標
declare @name sysname
declare csr1 cursor
for select TABLE_NAME from INFORMATION_SCHEMA.TABLES
open csr1
FETCH NEXT FROM csr1 INTO @name
while (@@FETCH_STATUS=0)
BEGIN
SET @name='原架構名.'+@name
EXEC SP_ChangeObjectOwner @name, '新架構名'
fetch next from csr1 into @name
END
CLOSE csr1
DEALLOCATE csr1
方法二:使用系統存儲過程sp_MSforeachtable
EXEC sp_MSforeachtable @command1="EXEC SP_ChangeObjectOwner '?','新架構名'"
如何在SQL 2005中批量修改存儲過程的架構。
執行以下SQL,將執行結果拷貝出來,批量執行既可。
SELECT 'ALTER SCHEMA dbo TRANSFER ' + s.Name + '.' + p.Name