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种方法,数据库修复后所做的修改工作较少。