2012-03-27 88 views
0

我目前正在使用SQL Server 2005,并尝试从几个月前恢复数据库,但当我尝试创建帐户时恢复它时,它告诉我该帐户已存在但您无法看到它在安全之下。我尝试删除该帐户,但它告诉我该帐户不存在可以放弃...但是当我尝试创建它时,它告诉我它存在......它令我疯狂。我完全从服务器和所有链接的服务器和所有数据库中删除该帐户,并且我试图再次重新创建它,它可以在所有数据库上运行,除了它始终存在的一个数据库。任何想法可能是什么或我应该检查什么?SQL Server帐户问题

回答

1

作为一名DBA,我总是遇到这个问题。而GUI并没有什么帮助。你的SQL服务器有你想要的账号,db有你想要的账号,但是它们在恢复时不会自动连接。

解决这个问题的真正方法是停止使用个人账户。仅基于作为活动目录组的成员提供对数据库的访问权限。然后,您可以将访问问题提供给AD组。顺便说一句:虽然个人帐户不会在还原时自动重新连接,但群组访问可以。

下面是我用来解决相同问题的一些代码。

create procedure [dbo].[proc_FarSyncLogins] @TargetDB nvarchar(128)= '' as 
begin 
    SET NOCOUNT ON 

    declare @cmd varchar(1000) 

    begin try 
     drop table master.dbo.NeededUsers 
    end try 
    begin catch 
     print 'could not: drop table master.dbo.NeededUsers' 
    end catch 

    set @cmd='select name collate Latin1_General_CI_AS as name,is_disabled 
       into master.dbo.NeededUsers 
       from ['[email protected]+'].sys.sql_logins' 

    --print @cmd 
    exec(@cmd) 

    print 'logins that need to be enabled' 
    select * from master.dbo.NeededUsers 

    declare @UserName nvarchar(128) 
    declare SyncUsers1 cursor fast_forward for SELECT Name FROM master.dbo.NeededUsers 

    OPEN SyncUsers1 
    FETCH NEXT FROM SyncUsers1 INTO @UserName 
    WHILE @@FETCH_STATUS = 0 
     BEGIN 
      set @cmd = '' 
      if @TargetDB <> '' 
      begin 
       set @[email protected]+'Use ['[email protected]+']; '+char(10) 
      end 
      begin try 
       SET @cmd = @cmd+'ALTER LOGIN ['[email protected]+'] ENABLE; '+char(10) 
       SET @cmd = @cmd+'exec sp_change_users_login @Action=''Auto_Fix'', @UserNamePattern ='''[email protected]+'''; '+char(10) 
       PRINT @cmd 
       EXEC(@cmd) 
      end try 
      begin catch 
       Print 'Failed :'[email protected] 
      end catch 

      FETCH NEXT FROM SyncUsers1 INTO @UserName 
     END 
    CLOSE SyncUsers1 
    DEALLOCATE SyncUsers1 
end 

然后,只需

exec master.dbo.proc_FarSyncLogins '<yourDBName>'; 

它是确定地哈克,你将要仔细阅读输出来验证你的意思做的所有这些行动。但大多数时候你只想恢复你以前的一切。

1

该帐户存在于数据库和服务器级别。

因此,您需要从数据库本身删除帐户,但不能从服务器中删除该帐户,因为它不存在该帐户。 你有没有试过...

use {yourdatabasename} 
go 
EXEC sp_dropuser '{username}' 
+0

嘿感谢您的快速回复。是的,我试过了,它不工作...仍然给我一个错误,用户不存在删除。 – 2012-03-27 14:09:42

+0

你看到它在这里... select * from sys.sysusers – 2012-03-27 14:22:34

+0

,你可以在这里看看它的主... select * from sys.syslogins – 2012-03-27 14:24:35

2

你在数据库中有孤立的用户帐户。将数据库从一台服务器复制/移动到另一台服务器时,这是非常常见的问题。您需要将它们从数据库用户中删除或者更好的选择是创建服务器登录并将该登录映射到该孤立数据库用户。 虽然回来我用my blog写了一些演示脚本,但你可能想看看它。或者只需查看this MSDN link即可使用可用于管理孤立用户的SP。