因为sql 2000数据库最初是在本地机器上建立的,用了本地的用户名,但上传到服务器上,服务商提供的用户名不一样,打不开数据库,需要修改下架构者名称,我只知道在数据库管理器上一个一个修改,但表太多了,好麻烦,请问有什么好的办法可以修改

解决方案 »

  1.   

    转:《SQL Server Schema:把 数据库对象的 schema 都转为 dbo(SQL Server 2005)》原标题《把 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_SQLdeclare @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 的写法,一次搞定。 
      

  2.   

    貌似楼上的不能用啊 消息 208,级别 16,状态 1,第 7 行
    对象名 'sys.tables' 无效
      

  3.   

    可能上面是sql 2005才能用。试下这个--修改所有用户创建的对象所有者为dbo
    exec sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo'''
      

  4.   

    EXEC   sp_changeobjectowner   'a.tb_user', 'b'
      

  5.   


    CREATE   PROCEDURE   ChangeProcOwner   
      @OldOwner as   NVARCHAR(128),  
      @NewOwner as   NVARCHAR(128)   
      AS   
        
      DECLARE   @Name   as   NVARCHAR(128)     
      DECLARE   @Owner as   NVARCHAR(128)   
      DECLARE   @OwnerName as   NVARCHAR(128)   
        
      DECLARE   curObject   CURSOR   FOR     
      select 'Name' =   name,   
      'Owner' =   user_name(uid)   
      from   sysobjects   
      where   user_name(uid)=@OldOwner   and   xtype='p'   
      order   by   name   
        
      OPEN     curObject   
      FETCH   NEXT   FROM   curObject   INTO   @Name,   @Owner   
      WHILE(@@FETCH_STATUS=0)   
      BEGIN           
      if   @Owner=@OldOwner     
      begin   
      set   @OwnerName   =   @OldOwner   +   '.'   +   rtrim(@Name)   
      exec   sp_changeobjectowner   @OwnerName,   @NewOwner   
      end   
        
      FETCH   NEXT   FROM   curObject   INTO   @Name,   @Owner   
      END   
        
      close   curObject   
      deallocate   curObject   
      GO
      

  6.   

    可能上面是sql 2005才能用。 试下这个 --修改所有用户创建的对象所有者为dbo 
    exec sp_msforeachtable 'sp_changeobjectowner ''?'', ''dbo'''