SQL Server2005可以使用系統(tǒng)存儲(chǔ)過(guò)程sp_changeobjectowner更改數(shù)據(jù)庫(kù)對(duì)象的所有者。
sp_changeobjectowner 用于更改當(dāng)前數(shù)據(jù)庫(kù)中對(duì)象的所有者。
sp_changeobjectowner '對(duì)象名(包括架構(gòu)名)','新架構(gòu)名'
語(yǔ)法
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
參數(shù)
[@objname =] 'object'
當(dāng)前數(shù)據(jù)庫(kù)中現(xiàn)有的表、視圖或存儲(chǔ)過(guò)程的名稱。object 的數(shù)據(jù)類型為 nvarchar(517),沒(méi)有默認(rèn)值。object 可用現(xiàn)有對(duì)象所有者限定,格式為 existing_owner.object。
[@newowner =] 'owner'
即將成為對(duì)象的新所有者的安全帳戶的名稱。owner 的數(shù)據(jù)類型為 sysname,沒(méi)有默認(rèn)值。owner 必須是當(dāng)前數(shù)據(jù)庫(kù)中有效的 Microsoft® SQL Server™ 用戶或角色或 Microsoft Windows NT® 用戶或組。指定 Windows NT 用戶或組時(shí),請(qǐng)指定 Windows NT 用戶或組在數(shù)據(jù)庫(kù)中已知的名稱(用 sp_grantdbaccess 添加)。
返回代碼值
0(成功)或 1(失敗)
注釋
對(duì)象所有者(或擁有對(duì)象的組或角色的成員)對(duì)對(duì)象有特殊的權(quán)限。對(duì)象所有者可以執(zhí)行任何與對(duì)象有關(guān)的 Transact-SQL 語(yǔ)句(例如 INSERT、UPDATE、DELETE、SELECT 或 EXECUTE),也可以管理對(duì)象的權(quán)限。
如果擁有對(duì)象的安全帳戶必須要除去,但同時(shí)要保留該對(duì)象,請(qǐng)使用 sp_changeobjectowner 更改對(duì)象所有者。該過(guò)程從對(duì)象中刪除所有現(xiàn)有權(quán)限。在運(yùn)行 sp_changeobjectowner 之后,需要重新應(yīng)用要保留的任何權(quán)限。
由于這個(gè)原因,建議在運(yùn)行 sp_changeobjectowner 之前,編寫現(xiàn)有權(quán)限的腳本。一旦更改了對(duì)象的所有權(quán),可能要使用該腳本重新應(yīng)用權(quán)限。在運(yùn)行該腳本之前需要在權(quán)限腳本中修改對(duì)象所有者。有關(guān)編寫數(shù)據(jù)庫(kù)腳本的更多信息,請(qǐng)參見編寫數(shù)據(jù)庫(kù)文檔和腳本。
批量修改請(qǐng)用:
方法一:使用游標(biāo)
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='原架構(gòu)名.'+@name
EXEC SP_ChangeObjectOwner @name, '新架構(gòu)名'
fetch next from csr1 into @name
END
CLOSE csr1
DEALLOCATE csr1
方法二:使用系統(tǒng)存儲(chǔ)過(guò)程sp_MSforeachtable
EXEC sp_MSforeachtable @command1="EXEC SP_ChangeObjectOwner '?','新架構(gòu)名'"
如何在SQL 2005中批量修改存儲(chǔ)過(guò)程的架構(gòu)。
執(zhí)行以下SQL,將執(zhí)行結(jié)果拷貝出來(lái),批量執(zhí)行既可。
SELECT 'ALTER SCHEMA dbo TRANSFER ' + s.Name + '.' + p.Name
FROM sys.Procedures p INNER JOIN sys.Schemas s on p.schema_id = s.schema_id
WHERE s.Name = '舊的架構(gòu)名稱'