在导入/导出MS SQL Server 数据库到远程数据库的时候,我们经常会发现一个:
导入或者导出时,数据库对象的所有者,默认是远程数据库的用户名
当我们建完SQL查询语句复制数据库表后,却发现有两套所有者不同的数据库表。
其实,可以在远程建完数据库结构以后,修改所有用户表的所有者为远程数据库的账户来实现。具体方法:
在远程数据库新建查询,输入以下SQL语句(如:sq_wlg456为远程数据库用户,dbo是本地的所有者)
1. 修改表的所有者
declare cur cursor for
select name from sysobjects where uid=user_id('sq_wlg456') and xtype='U'
declare @name sysname
declare @sqlstr varchar(5000)
open cur
fetch next from cur
into @name
while @@fetch_status=0
begin
set @sqlstr='exec sp_changeobjectowner ''sq_wlg456.'+@name+''',''dbo'''
exec (@sqlstr)
fetch next from cur
into @name
end
close cur
deallocate cur
2. 修改存储过程的所有者
declare @tn varchar(120)
declare procedure_cursor cursor for
SELECT '[' + sysusers.name + '].' + sysobjects.name AS procedure_name
FROM sysobjects INNER JOIN sysusers ON sysobjects.uid = sysusers.uid
WHERE sysusers.name = 'YourUserName' AND sysobjects.type = 'P'
open procedure_cursor
fetch next from procedure_cursor into @tn
while @@FETCH_STATUS = 0
begin
exec sp_changeobjectowner @tn, 'dbo'
fetch next from procedure_cursor into @tn
end
close procedure_cursor
deallocate procedure_cursor
3. 修改视图的所有者
declare @tn varchar(120)
declare view_cursor cursor for
SELECT '[' + sysusers.name + '].' + sysobjects.name AS view_name
FROM sysobjects INNER JOIN sysusers ON sysobjects.uid = sysusers.uid
WHERE sysusers.name = 'YourUserName' AND sysobjects.type = 'V'
open view_cursor
fetch next from view_cursor into @tn
while @@FETCH_STATUS = 0
begin
exec sp_changeobjectowner @tn, 'dbo'
fetch next from view_cursor into @tn
end
close view_cursor
deallocate view_cursor
注意:三段脚本只是为便于理解才分开来写,不同之处只在于sysobjects.type = 'U',sysobjects.type = 'P'及sysobjects.type = 'V'