把一个SQL2000的数据库,分离附加到一个SQL2005的数据库上,登陆用户名和密码都已经创建,用下面的方法可以查询出结果
select * from 用户名.表名
而如果用下面的语句查询,则提示对象无效
select * from 表名开始以为是孤立用户的问题,查找下,好像又不是,sp_change_users_login 'Report' 没有任何的结果。用户也有dbowner权限。啥问题呢?
select * from 用户名.表名
而如果用下面的语句查询,则提示对象无效
select * from 表名开始以为是孤立用户的问题,查找下,好像又不是,sp_change_users_login 'Report' 没有任何的结果。用户也有dbowner权限。啥问题呢?
你说的"用户也有dbowner权限",是不是该数据库的权限.
dbo作为架构是为了更好的与2000兼容,
在2000中DataBaseName.dbo.TableName解释为:数据库名.用户名.表名,
在2005中DataBaseName.dbo.TableName解释为:数据库名.架构名.表名,
这样2000中的代码移植到2005中就不会报错(dbo在2005中是默认的架构,创建表时,如不指定架构,则默认为属于dbo为个架构)。
比如:你以User1登录进去并建表Table,而未指定DBO,
当用户User2登进去想访问Table时就得知道这个Table是你User1建立的,要写上User1.Table,如果他不知道是你建的,则访问会有问题。
如果你建表时把所有者指给了Dbo,则别的用户进来时写上Dbo.Table就行了,不必知道User1。
不光表是如此,视图等等数据库对象建立时也要如此才算是好。
如果登录的login不是属于高级管理员组的,创建对象时如果不加上dbo,只输入名称,系统就会默认对象的所有者为登录的用户.
而不是dbo
如果想方便调用,登录时如果不是高级管理员的,创建对象时最好加上dbo.
如创建表
create table dbo.表名 (....
创建视图
create view dbo.视图名 as ....这样处理后调用就不用加上用户名.
1. your DB -- 安全性 -- 用户
2. 在“用户A”上右键 -- 属性 -- 常规
3. 将“默认架构”改为用户A
上面有兄弟说把用户或者说架构改成DBO,由于数据库的脚本比较多,有的也嵌入了程序,要改恐怕有点麻烦。 对于这个问题,可以给相应的表取别名的。例如:在2000中使用select * from tb
那么在2005中如果需要使用select * from a.tb才能查询出来的话,可以给a.tb取一个别名加入为tb,那么就可以使用select * from tb 来进行查询了。