SQL Server帐户问题

时间:2012-03-27 13:43:09

标签: sql-server sql-server-2008 sql-server-2005

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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 ['+@TargetDB+'].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 @cmd=@cmd+'Use ['+@TargetDB+']; '+char(10)
            end
            begin try
                SET @cmd = @cmd+'ALTER LOGIN ['+@UserName+'] ENABLE; '+char(10)
                SET @cmd = @cmd+'exec sp_change_users_login @Action=''Auto_Fix'', @UserNamePattern ='''+@UserName+'''; '+char(10)
                PRINT @cmd
                EXEC(@cmd)
            end try
            begin catch
                Print 'Failed :'+@cmd
            end catch

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

然后只是

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

确定HACKY,您需要仔细阅读输出以验证您是否打算执行所有这些操作。但大多数时候你只想恢复以前的所有东西。