最近刚刚开始学习sql server 2005。感觉和2000有很大不同。我的问题是,如果我原来的数据库服务器是2000的,备份数据库后删除2000,安装成2005的。然后恢复数据库并新建了一个schema(比如aaa)原来的对象全部搬到新的schema中。但我的应用程序中全部都是不加schema的。如果一个个加上schema,也太麻烦了。有什么办法不用改动应用程序来实现呀?
调试欢乐多
EXEC sp_MSforeachtable 'exec sp_changeobjectowner ''?'', ''dbo'''
EXEC sp_MSforeachtable 'exec sp_changeobjectowner ''?'', ''dbo'''
/**
《把 Schema 都转为 dbo》SQL 2005 引入了 Schema 的概念,让 DBA 在管理 DB 对象时方便了很多。在
SQL 2000 的时代,当 user create table 时, user 就是 table 的 owner,
问题来了,如果这个 user 离职了,要把该 user 名下的 table 转移到别人的
名下十分麻烦,而且这样的困扰会经常出现,因此很多 DBA 索性将所有的
table 或对象都用 dbo 来建立,可是在安全性上又会出现问题。
Schema 的概念与机制在 Oracle 里很早就有了,SQL 2005 算是顺应潮流吧。虽
然更改对象所属的 Schema 很容易,但是如果一次要更改很多的话也是有点麻烦
,我刚好碰到了这样的情形,客户从主机端利用工具把资料转到 SQL 2005,但
是Schema 不是 dbo,希望我们做个修正,一个 table 一个 table 改挺花时间的。
**/
--T_SQL: declare @table_name varchar(50)
,@schema_id int
,@schema_name varchar(50)
,@sql_cmd nvarchar(255)declare table_cursor cursor for
select name, schema_id
from sys.tables
where schema_id <> 1 -- dbo 的 schema_id = 1
order by nameopen table_cursorfetch next from table_cursor into @table_name, @schema_idwhile @@fetch_status = 0
begin
print '' select @schema_name = name
from sys.schemas
where schema_id = @schema_id select @sql_cmd = 'alter schema dbo transfer ' + @schema_name + '.' + @table_name print @sql_cmd
exec sp_executesql @sql_cmd fetch next from table_cursor into @table_name, @schema_id
endclose table_cursor
deallocate table_cursor
go/**
这个范例就是把所有非 dbo 名下的 table 都转给 dbo,每个 database 都有一
些固定的 Schema,例如 dbo,而 dbo 的 schema_id 固定为 1,所以只要找出
每个 table 所属的 Schema,搭配 Alter Schema 的语法就可以了,当然,配合
cursor 的写法,一次搞定。
**/
其实很简单,就是把连接数据库的用户的默认架构改成这个要应用的架构就可以了(当然,这个用户首先要有这个架构的权限)。这样,每次写sql时就不用每次加上架构名字了