2012-03-27 2 views
0

현재 SQL Server 2005를 사용 중이고 몇 달 전에 데이터베이스를 복원하려고 시도하지만 계정을 만들려고 할 때 데이터베이스를 복원하면 해당 계정이 이미 있지만 표시되지 않는다고 알려줍니다. 그것은 보안 아래. 나는 그 계정을 떨어 뜨리려고 노력했지만 그 계정은 존재하지 않는다는 것을 나에게 말해 준다. 그러나 내가 그것을 만들려고 할 때 그것이 존재한다는 것을 말해 준다. 그것은 나를 미치게 만든다. 나는 그 계정을 서버와 모든 연결된 서버와 모든 데이터베이스에서 완전히 제거했다. 다시 작성하려고 시도했지만 다시 말하면 모든 데이터베이스에서 작동한다. 어떤 아이디어가 될 수 있는지 또는 무엇을 확인해야합니까?SQL Server 계정 문제

답변

1

DBA로서 나는 항상이 문제를 겪고 있습니다. 그리고 GUI는별로 도움이되지 않습니다. SQL 서버에 원하는 계정이 있고 데이터베이스에 원하는 계정이 있지만 복원시 자동 연결되지 않습니다.

이 문제를 해결하는 실제 방법은 개인 계정을 사용 중지하는 것입니다. 활성 디렉터리 그룹의 구성원이라는 관점에서 DB에 대한 액세스 만 제공하십시오. 그런 다음 AD 그룹에 액세스 문제를 부여 할 수 있습니다. BTW : 개별 계정은 복원시 자동으로 다시 연결되지 않지만 그룹 액세스는 복원합니다.

다음은 동일한 문제를 해결하기 위해 사용하는 일부 코드입니다.

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

안녕하세요. 빠른 답장을 보내 주셔서 감사합니다. 그래, 나는 그것을 시도하고 작동하지 않습니다 ... 아직도 사용자가 삭제할 존재하지 않는 오류를 제공합니다. –

+0

여기를 보시나요? select * from sys.sysusers –

+0

그리고 여기서 master를 볼 수 있습니다. select * from sys.syslogins –

2

당신은 고아가있는 사용자 계정을 시도했습니다. 한 서버에서 다른 서버로 데이터베이스를 복사/이동할 때 매우 일반적인 문제입니다. 데이터베이스 사용자로부터 제거 할 필요가 있습니다. 더 좋은 옵션은 Server Login을 생성하고 그 로그인을 고아 데이터베이스 사용자와 매핑하는 것입니다. 다시 약간의 데모 스크립트를 사용하여 my blog에 그것에 대해 썼다면, 당신은 그것을보고 싶을지도 모른다. 또는 고아 사용자를 관리하는 데 사용할 수있는 SP의 사용에 대해서는 this MSDN link을 참조하십시오.