Проблема с учетной записью SQL Server - PullRequest
0 голосов
/ 27 марта 2012

В настоящее время я использую SQL Server 2005, и я пытаюсь восстановить базу данных пару месяцев назад, но когда я восстанавливаю ее, когда пытаюсь создать учетную запись, она говорит мне, что учетная запись уже существует, но вы не можете видеть ее в безопасности.Я попытался удалить эту учетную запись, но она говорит мне, что эта учетная запись не существует для удаления ... Но когда я пытаюсь создать ее, она говорит мне, что она существует ... Это сводит меня с ума.Я полностью удалил эту учетную запись с сервера и всех связанных серверов и всех баз данных, и я попытался воссоздать ее заново, она будет работать со всей базой данных, кроме той, которая продолжает повторять, что она уже существует.Любые идеи, что это может быть или что еще я должен проверить?

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

У вас есть осиротевшие учетные записи пользователей в базе данных. Это очень распространенная проблема, когда вы копируете / перемещаете базу данных с одного сервера на другой. Вам нужно будет удалить их от пользователя базы данных. Или, что лучше, создайте Логин сервера и сопоставьте этот вход с этим потерянным пользователем базы данных. В то время как я писал об этом в моем блоге с некоторым демо-сценарием, вы можете захотеть посмотреть на него. Или просто посмотрите на эту ссылку MSDN для использования SP, который можно использовать для управления осиротевшими пользователями.

1 голос
/ 27 марта 2012

Как администратор БД, я постоянно сталкиваюсь с этой проблемой.И графический интерфейс не очень помогает.У вашего SQL-сервера есть нужные вам учетные записи, в базе данных есть нужные учетные записи, но они не подключаются автоматически при восстановлении.

РЕАЛЬНЫЙ способ исправить это - STOP-USING-INDIVIDUAL-ACCOUNTS.Предоставлять доступ к БД можно только на основании того, что они являются членом группы активных каталогов.Тогда вы можете дать вопросы доступа к 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>';

Это определенно ХАКИ, вам нужно внимательно прочитать вывод, чтобы убедиться, что вы намеревались выполнить все эти действия.Но большую часть времени вы просто хотите восстановить все, что у вас было раньше.

1 голос
/ 27 марта 2012

Учетная запись существует в базе данных и на уровне сервера.

Таким образом, вам нужно удалить учетную запись из самой базы данных, а не с сервера, поскольку ее там нет. ты пробовал ...

use {yourdatabasename}
go
EXEC sp_dropuser '{username}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...