sqlserver数据还原或者转移后,出现孤立帐号问题的解决方案,表更改用户为DBO

SQL Server的数据库帐号经常会在还原后出现无法连接的情况,很是让人郁闷...
以下提供两种解决办法,分友好型和禽兽型.

20081025 修改 : 有更加方便的做法

1. 用查询分析器,更改库里面的所有表的所有者为dbo

 

更改表的所有者

 

use ntbbs
 EXEC   sp_MSforeachtable   'exec   sp_changeobjectowner   ''?'',''dbo''   '

 

如果有存储过程

 

  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  
   
  --exec   ChangeProcOwner   '原用户','新用户' 

 

 

2. 在企业管理器删除原数据库滞留的用户,然后新建一个,角色选择db_owner,默认数据库选这个,搞定。


1.友好型

解决数据库孤立帐号的方法,百事不爽。欢迎尝试。
@sid是数据库帐号的剩下的两个分别的数据库名称和帐号名称。

Exec sp_configure 'allow updates',1  ---允许更新系统表。
RECONFIGURE WITH OVERRIDE
    
Use Master
Select sid From syslogins Where Name = @UserName  --这里查询现在新建帐号的SID
Use  @DBName  --使用数据库的名称
Update sysusers Set sid = @sid  Where name = @UserName --@sid为上面查询到的值,更新当前库的sysusers中帐号的SID使其同步。问题解决。

Exec sp_configure 'allow updates',0  --关闭系统表更新
RECONFIGURE WITH OVERRIDE

PS:之所以说是友好型就是因为他并不变更数据库的连接帐号名称,甚至可以保持密码也不变化。因为这个方法主要是通过同步SQL Server数据库中的SID来解决掉SQL Server帐号孤立的问题.

2.禽兽型
在数据库备份更换系统后经常出现帐号无法正常访问表的情况,下面是个解决的大概例子

先运行以下语句,把当前库内的表的所有者都改为DBO当然你也可以改为别的只要修改UID的值即可

sp_configure 'allow updates','1'
go
reconfigure with override
go
update sysobjects set uid=1 where uid<>1  --更新数据库中表的所有者,强制为DBO或者您已知UID的SQL Server帐号。
go
sp_configure 'allow updates','0'
go
reconfigure with override

然后再到库内用户选项里把孤立帐户删除即可...

注:UID的查询可以使用下面的语句

USE master
SELECT *
FROM sysusers
WHERE uid >= '1'

PS:禽兽型的方法兼容行相对高些,对于数字为开头的数据库有较好的支持。

哈哈其实个人比较推荐第1种方法,数据库修复后所做的修改工作较少。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值