把一个SQL2000的数据库,分离附加到一个SQL2005的数据库上,登陆用户名和密码都已经创建,用下面的方法可以查询出结果
select * from 用户名.表名
而如果用下面的语句查询,则提示对象无效
select * from 表名开始以为是孤立用户的问题,查找下,好像又不是,sp_change_users_login 'Report' 没有任何的结果。用户也有dbowner权限。啥问题呢?

解决方案 »

  1.   

    恐怕是架构的问题.
    你说的"用户也有dbowner权限",是不是该数据库的权限.
      

  2.   

    看看表的所有者是谁,把它改为dbo试试.
      

  3.   

    dbo是默认用户也是架构, 
    dbo作为架构是为了更好的与2000兼容, 
    在2000中DataBaseName.dbo.TableName解释为:数据库名.用户名.表名, 
    在2005中DataBaseName.dbo.TableName解释为:数据库名.架构名.表名, 
    这样2000中的代码移植到2005中就不会报错(dbo在2005中是默认的架构,创建表时,如不指定架构,则默认为属于dbo为个架构)。
      

  4.   

    通过用DBO作为所有者来定义对象,能够使数据库中的任何用户引用而不必提供所有者名称。 
    比如:你以User1登录进去并建表Table,而未指定DBO, 
    当用户User2登进去想访问Table时就得知道这个Table是你User1建立的,要写上User1.Table,如果他不知道是你建的,则访问会有问题。 
    如果你建表时把所有者指给了Dbo,则别的用户进来时写上Dbo.Table就行了,不必知道User1。 
    不光表是如此,视图等等数据库对象建立时也要如此才算是好。 
      

  5.   

    如果对象(表,视图,存储过程等)不是属于dbo使用时就要加上用户名,
    如果登录的login不是属于高级管理员组的,创建对象时如果不加上dbo,只输入名称,系统就会默认对象的所有者为登录的用户.
    而不是dbo
    如果想方便调用,登录时如果不是高级管理员的,创建对象时最好加上dbo.
    如创建表
    create table dbo.表名  (....
    创建视图
    create view dbo.视图名 as ....这样处理后调用就不用加上用户名.
      

  6.   

    2005数据库对象所属的架构schema的问题,如果建立的表所属的schema和用户登录所使用的schema相同的话就没这样的问题了
      

  7.   

    难得大家讨论得那么热烈,我再给帖子加100分。前面我描述得不是很清楚,是这样的,在SQL2000中,数据库用户名和登录名都是一样的,假设都为A,表的所有者为 用户A.表名 ,我在查询分析器中用登录名A登陆,然后在查询分析器中用“select * from 表名” 是可以查询得出来结果的。然后我再把这个数据库弄到2005上,也试过自己用SQL2000的脚本在SQL2005上建立数据库,目前在SQL2005的数据库中表的所有者仍然为 用户A.表名,登录名也是 A,但是在查询分析器中用“select * from 表名”就是查询不出来结果,而必须要用“select * from 用户A.表名”上面有兄弟说把用户或者说架构改成DBO,由于数据库的脚本比较多,有的也嵌入了程序,要改恐怕有点麻烦。这个问题咋解决呢?我以前没有用过SQL2005,SQL2000用得也不是很多,让大家见笑了。
      

  8.   

    你该用户没有加入到DBO架构里面去
      

  9.   

    原因:sql2005默认架构dbo,所以select * from 表名 等价于 select * from dbo.表名 , 因此查不出结果。试试这个解决方法:更改指定数据库的默认架构。
    1. your DB -- 安全性 -- 用户 
    2. 在“用户A”上右键 -- 属性 -- 常规 
    3. 将“默认架构”改为用户A
      

  10.   

    在2005中增加个架构的,一般查询的时候是要添加架构名的。也就是 数据库名.架构名.表名。——————————————————————————————
    上面有兄弟说把用户或者说架构改成DBO,由于数据库的脚本比较多,有的也嵌入了程序,要改恐怕有点麻烦。 对于这个问题,可以给相应的表取别名的。例如:在2000中使用select * from tb 
    那么在2005中如果需要使用select * from a.tb才能查询出来的话,可以给a.tb取一个别名加入为tb,那么就可以使用select * from tb 来进行查询了。
      

  11.   

    架构问题,将访问的表的架构设置为dbo,以后访问就不需要带用户名了。
      

  12.   

    重建后估计是用的DBO架构,这个好像是默认的啊。