本文介紹了SQL Server 2016更改對象所有者的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我繼承了一個SQL 2008 dBASE,它的所有對象都以開發人員作為所有者的名稱作為前綴,即ownername.sp_get_all_USERS。
我已將dBASE還原到SQL Server 2016 Express Edition。
有數百個dBASE對象,有沒有辦法自動將對象所有者更改為dbo,而不是手動編輯每個對象?
我嘗試過以下操作,但自SQL Server 2005以來,您顯然不能再對對象進行即席更改?
SELECT * from sysobjects where uid = user_id('UseNAme')
declare @Return int
exec @Return = sp_configure 'allow updates', '1'
SELECT @Return as 'Returned Code'
GO
reconfigure WITH OVERRIDE
GO
DECLARE @Rows int, @Error int
BEGIN TRANSACTION
update sysobjects set uid = user_id('dbo') where uid = user_id('UseNAme')
SELECT @Error = @@Error, @Rows = @@RowCount
SELECT @Rows as '#Rows'
IF @Rows > 0
BEGIN
SELECT @Rows AS '#Rows'
COMMIT TRANSACTION
END
else
BEGIN
SELECT @Error AS 'Error #'
ROLLBACK TRANSACTION
END
exec sp_configure 'allow updates', '0'
reconfigure WITH OVERRIDE
go
最感謝的任何幫助。
推薦答案
您必須使用更改架構…
ALTER SCHEMA oldschemaname TRANSFER dbo.Address;
自動使用下面的
這會將具有非SYSTEM架構的所有表更改為dbo,請注意,如果您有兩個不同架構的表,則它們不能存在于同一架構中
select *,row_number() over (order by (select null)) as rownum
into #tables
from information_Schema.tables
where table_schema in (select name from sys.schemas
where name not in ('dbo','guest','INFORMATION_SCHEMA','sys') and principal_id <16384
)
now move
declare @min int,@max int
select @min=min(rownum),@max=max(rownum)
from #tables
declare @tblname varchar(255),@schemaname sysname
declare @sql varchar(max)
while @min<=@max
Begin
select @tblname=table_name,@schemaname=table_schema from
#tables where rownum=@min
set @sql='alter schema dbo transfer '+ @schemaname+'.'+@tblname
--print @sql
exec(@sql)
Set @min=@min+1
End
sp_根據文檔說明更改對象所有者..
此存儲過程僅適用于MicrosoftSQL Server2000中可用的對象。此功能將在Microsoft SQL Server的未來版本中刪除。避免在新的開發工作中使用此功能,并計劃修改當前使用此功能的應用程序。請改用ALTER SCHEMA或ALTER AUTHORIZATION。Sp_changeobjecowner同時更改架構和所有者。為了保持與早期版本的SQL Server的兼容性,僅當當前所有者和新所有者都擁有與其數據庫用戶名同名的架構時,此存儲過程才會更改對象所有者。
這篇關于SQL Server 2016更改對象所有者的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,