백업-> 복원 작업 후 사용자 권한이 엉망 임


11

여러 개의 SQL Server 2008 데이터베이스를 새 db 서버로 이동하여 모든 파일 (.bak 파일)을 백업하고 이러한 파일을 새 상자에 복사 한 후 복원했습니다 (모두 SQL Management Studio를 사용하여 수행).

모두 괜찮 았지만 이제는 이전 RDBMS에서 계속 작동하는 SQL Server 계정을 사용하여 데이터베이스에 로그인 할 수 없습니다. 내 Windows 인증 로그인은 여전히 ​​우연히 작동합니다.

이 아이디어를 가지고 사용자와 권한이 모두 새 데이터베이스 서버에 완벽하게 복제되지만 어딘가에 문제가있는 것 같습니다. 의견 / 제안 / 도움 제공에 감사드립니다 ;-)

답변:


7

나는 당신이 이미 당신의 문제에 대한 해결책을 찾았다는 것을 알았습니다. 원래의 질문에서 내가 발견 한 것 중 하나는 여전히 이전 서버에 액세스 할 수 있다는 것입니다.

SO에 대한 다음 질문에도 비슷한 문제가 있었고 사용자 권한을 생성하는 스크립트가있는 Microsoft 기사에 대한 링크가 포함되어 있습니다.

/programming/461385/restoring-a-backup-to-a-different-server-user-permissions

(질문에 대한 리소스는 http://support.microsoft.com/kb/918992에 나와 있습니다 . )

서버 설정을 Windows 인증에서 혼합 모드 인증으로 변경하여 문제를 해결 한 것처럼 들리지만 문제를 완전히 해결하지 못한 경우에 유용하다고 생각했습니다.


나는 이것이 사용자 / 권한에 대해 SQL Server를 처음으로 다루지 않을 것이라고 확신하므로 후손을 위해 기사를 책갈피로 지정합니다. 게시 해 주셔서 감사합니다.
5arx

6

이것을 "고아 사용자"라고합니다. 이를 해결하는 두 가지 방법이 있습니다.

  1. 가능한 경우 원래 마스터 데이터베이스를 "loginsource"로 복원하면 sys.server_principals에 모든 SQL Server 및 Windows 로그인을 생성하기에 충분한 정보가 있습니다. 즉, SID 및 암호화 된 비밀번호

  2. Windows 로그인 만 사용하는 경우 데이터베이스별로이를 실행하여 스크립트를 생성 할 수 있습니다

스크립트:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')

귀하의 답변에 감사드립니다. 내 웹 앱은 SQL 로그인을 사용하지만 Windows 계정은 관리 목적으로 사용됩니다. 제안한대로 'loginsource'로 복원하는 방법을 볼 수 없습니다. 자세히 설명해 주시겠습니까? 난 희망 이 모든 Managment를 Studio를 사용하여 수행 할 수 있습니다?
5arx

추신. 나는이 문서 : support.microsoft.com/kb/274188을 따르고 모든 스크립트를 분명히 실행했습니다. 그러나 아무것도 변하지 않았습니다.
5arx

5

이상적으로는 복원을 수행하기 전에 사용자와 권한을 스크립팅하는 것이 좋습니다. 그 일이 발생하지 않았다면 사실 이후에 문제를 해결해야하며 기회가 놓칠 수는 있지만 기회의 약 90 %를 얻을 수 있어야합니다.

가장 먼저 확인해야 할 것은 새 서버에 동일한 로그인이 있는지 여부입니다. 그렇지 않은 경우 새 서버에서 로그인을 생성 할 수 있는지 확인해야합니다. 그들이 생성되어야한다고 생각하지 마십시오. 왜 그들이 존재하지 않았는 지에 대한 합당한 이유가있을 수 있습니다. 그런 다음 sysusers 테이블을 통해 파고 들어 만들 수 있습니다.

다음과 유사한 것을 실행하여 고아 사용자를 수정할 수 있습니다.

DECLARE @username varchar(25), @loginsid varbinary(85)
DECLARE fixusers CURSOR
FOR
SELECT UserName = name 
    FROM sysusers
    WHERE issqluser = 1 
    and (sid is not null and sid <> 0x0)
    and suser_sname(sid) is null
    and name in (select name from master..syslogins)
    ORDER BY name
OPEN fixusers
FETCH NEXT FROM fixusers
INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_change_users_login 'update_one', @username, @username

    FETCH NEXT FROM fixusers
    INTO @username
END CLOSE fixusers
DEALLOCATE fixusers 

이 코드는 SQL2008에서 작동하지만 SQL2000과 호환되도록 작성되었습니다.


스크립트 주셔서 감사합니다. Management Studio에서이 작업을 수행 할 방법이 없다고 가정 할 수 있습니까? 또한 일부 사람들은 DB 수준 사용자를 삭제하고 다시 만들 것을 제안합니다. 이것이 권장됩니까?
5arx

이것은 로그인이 이미 존재하고 SID 만 침해한다고 가정합니다
gbn

sp_change_users_login이 SID를 업데이트하지 않습니까? msdn.microsoft.com/ko-kr/library/ms174378.aspx
SQLRockstar

5arx-SSMS에서는이를 수행 할 방법이 없습니다. 내가 말했듯이 이상적인 상황에서는 복원 전에 권한을 스크립팅했을 것입니다. 이 시점에서 직접 손으로 다시 만들거나 물건을 직접 조각해야합니다. 내가 당신이라면, 나는 오래된 DB를 복원하고, 권한을 스크립팅하고, 다른 서버에서 복원을 한 다음, 권한을 다시 실행할 것입니다.
SQLRockstar

"Update_One : 현재 데이터베이스의 지정된 사용자를 기존 SQL Server 로그인에 연결합니다. 사용자 및 로그인을 지정해야합니다. 암호는 NULL이거나 지정하지 않아야합니다." 따라서 로그인이 이미 존재한다고 가정합니다.
gbn


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.