SQL Server 2005 인스턴스 간에 로그인 및 암호를 전송하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 918992 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

소개

이 문서에서는 서로 다른 서버에 있는 Microsoft SQL Server 2005 인스턴스 간에 로그인과 암호를 전송하는 방법을 설명합니다.

다른 버전의 SQL Server 인스턴스 간에 로그인과 암호를 전송하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
246133 SQL Server 인스턴스 간에 로그인 및 암호를 전송하는 방법

추가 정보

이 문서에서는 서버 A와 서버 B가 서로 다른 서버이고 이 두 서버에서 SQL Server 2005를 실행하고 있다고 가정합니다.

서버 A의 SQL Server 인스턴스에서 서버 B의 SQL Server 인스턴스로 데이터베이스를 이동한 후 서버 B에서 이 데이터베이스에 로그인할 수 없고 다음과 같은 오류 메시지가 나타날 수 있습니다.
사용자 'UserName'이(가) 로그인하지 못했습니다. (Microsoft SQL Server, 오류: 18456)
이 문제는 서버 A의 SQL Server 인스턴스에서 서버 B의 SQL Server 인스턴스로 로그인과 암호를 전송하지 않았기 때문에 발생합니다.

서버 A의 SQL Server 인스턴스에서 서버 B의 SQL Server 인스턴스로 로그인과 암호를 전송하려면 다음과 같이 하십시오.
  1. 서버 A에서 SQL Server Management Studio를 시작한 다음 데이터베이스를 가져온 원본 SQL Server 인스턴스에 연결합니다.
  2. 새 쿼리 편집기 창을 열고 다음 스크립트를 실행합니다.
    USE master
    GO
    IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
      DROP PROCEDURE sp_hexadecimal
    GO
    CREATE PROCEDURE sp_hexadecimal
        @binvalue varbinary(256),
        @hexvalue varchar (514) OUTPUT
    AS
    DECLARE @charvalue varchar (514)
    DECLARE @i int
    DECLARE @length int
    DECLARE @hexstring char(16)
    SELECT @charvalue = '0x'
    SELECT @i = 1
    SELECT @length = DATALENGTH (@binvalue)
    SELECT @hexstring = '0123456789ABCDEF'
    WHILE (@i <= @length)
    BEGIN
      DECLARE @tempint int
      DECLARE @firstint int
      DECLARE @secondint int
      SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
      SELECT @firstint = FLOOR(@tempint/16)
      SELECT @secondint = @tempint - (@firstint*16)
      SELECT @charvalue = @charvalue +
        SUBSTRING(@hexstring, @firstint+1, 1) +
        SUBSTRING(@hexstring, @secondint+1, 1)
      SELECT @i = @i + 1
    END
    
    SELECT @hexvalue = @charvalue
    GO
     
    IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
      DROP PROCEDURE sp_help_revlogin
    GO
    CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
    DECLARE @name sysname
    DECLARE @type varchar (1)
    DECLARE @hasaccess int
    DECLARE @denylogin int
    DECLARE @is_disabled int
    DECLARE @PWD_varbinary  varbinary (256)
    DECLARE @PWD_string  varchar (514)
    DECLARE @SID_varbinary varbinary (85)
    DECLARE @SID_string varchar (514)
    DECLARE @tmpstr  varchar (1024)
    DECLARE @is_policy_checked varchar (3)
    DECLARE @is_expiration_checked varchar (3)
    
    DECLARE @defaultdb sysname
     
    IF (@login_name IS NULL)
      DECLARE login_curs CURSOR FOR
    
          SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
    sys.server_principals p LEFT JOIN sys.syslogins l
          ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
    ELSE
      DECLARE login_curs CURSOR FOR
    
    
          SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 
    sys.server_principals p LEFT JOIN sys.syslogins l
          ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
    OPEN login_curs
    
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
    IF (@@fetch_status = -1)
    BEGIN
      PRINT 'No login(s) found.'
      CLOSE login_curs
      DEALLOCATE login_curs
      RETURN -1
    END
    SET @tmpstr = '/* sp_help_revlogin script '
    PRINT @tmpstr
    SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
    PRINT @tmpstr
    PRINT ''
    WHILE (@@fetch_status <> -1)
    BEGIN
      IF (@@fetch_status <> -2)
      BEGIN
        PRINT ''
        SET @tmpstr = '-- Login: ' + @name
        PRINT @tmpstr
        IF (@type IN ( 'G', 'U'))
        BEGIN -- NT authenticated account/group
    
          SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
        END
        ELSE BEGIN -- SQL Server authentication
            -- obtain password and sid
                SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
            EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
            EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
     
            -- obtain password policy state
            SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
            SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
     
                SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
    
            IF ( @is_policy_checked IS NOT NULL )
            BEGIN
              SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
            END
            IF ( @is_expiration_checked IS NOT NULL )
            BEGIN
              SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
            END
        END
        IF (@denylogin = 1)
        BEGIN -- login is denied access
          SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
        END
        ELSE IF (@hasaccess = 0)
        BEGIN -- login exists but does not have access
          SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
        END
        IF (@is_disabled = 1)
        BEGIN -- login is disabled
          SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
        END
        PRINT @tmpstr
      END
    
      FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
       END
    CLOSE login_curs
    DEALLOCATE login_curs
    RETURN 0
    GO
    
    참고 이 스크립트는 마스터 데이터베이스에 sp_hexadecimalsp_help_revlogin이라는 두 개의 저장 프로시저를 만듭니다.
  3. 다음 문을 실행합니다.
    EXEC sp_help_revlogin
    sp_help_revlogin 저장 프로시저에 의해 생성되는 출력 스크립트는 로그인 스크립트입니다. 이 로그인 스크립트는 원래 SID(보안 식별자) 및 암호를 가진 로그인을 만듭니다.
  4. 서버 B에서 SQL Server Management Studio를 시작한 다음 데이터베이스를 전송한 대상 SQL Server 인스턴스에 연결합니다.

    중요 5단계로 이동하기 전에 "비고" 절의 정보를 검토하십시오.
  5. 새 쿼리 편집기 창을 열고 3단계에서 생성한 출력 스크립트를 실행합니다.

비고

서버 B의 인스턴스에서 출력 스크립트를 실행하기 전에 다음 정보를 검토하십시오.
  • 출력 스크립트를 자세히 검토하십시오. 서버 A와 서버 B가 서로 다른 도메인에 있을 경우 출력 스크립트를 수정한 다음 CREATE LOGIN 문에서 원래 도메인 이름을 새 도메인 이름으로 대체해야 합니다. 새 도메인에 있는 액세스 권한이 부여된 통합 로그인의 SID가 원래 도메인에 있는 로그인의 SID와 같지 않기 때문에 사용자가 이러한 로그인에서 분리됩니다. 이러한 분리된 사용자 문제를 해결하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
    240872 SQL Server를 실행하는 서버 사이에서 데이터베이스를 이동할 때 사용 권한 문제를 해결하는 방법
    서버 A와 서버 B가 동일한 도메인에 있는 경우에는 동일한 SID가 사용되므로 사용자가 분리되지 않습니다.
  • 출력 스크립트에서는 로그인이 암호화된 암호를 사용하여 만들어집니다. 이는 CREATE LOGIN 문의 HASHED 인수 때문입니다. 이 인수는 PASSWORD 인수가 이미 해시된 후에 입력된 암호를 지정합니다.
  • 기본적으로 sysadmin 고정 서버 역할의 구성원인 sys.server_principals 뷰에서 SELECT 문을 실행할 수 있습니다. sysadmin 고정 서버 역할의 구성원이 필요한 권한을 사용자에게 부여하지 않을 경우 사용자는 출력 스크립트를 만들거나 실행할 수 없습니다.
  • 이 문서의 단계에서는 특정 로그인에 대한 기본 데이터베이스 정보를 전송하지 않습니다. 이는 서버 B에 기본 데이터베이스가 항상 있는 것이 아니기 때문입니다. 로그인에 대한 기본 데이터베이스를 정의하려면 ALTER LOGIN 문을 사용하고 로그인 이름과 기본 데이터베이스를 인수로 전달하십시오.
  • 서버 A의 정렬 순서가 대/소문자를 구분하지 않고 서버 B의 정렬 순서가 대/소문자를 구분할 수 있습니다. 이 경우 로그인과 암호를 서버 B의 인스턴스로 전송한 후 암호의 문자를 모두 대문자로 입력해야 합니다.

    또는 서버 A의 정렬 순서가 대/소문자를 구분하고 서버 B의 정렬 순서가 대/소문자를 구분하지 않을 수 있습니다. 이 경우 다음 조건 중 하나에 해당하지 않으면 서버 B의 인스턴스로 전송한 로그인과 암호를 사용하여 로그인할 수 없습니다.
    • 원래 암호에 아무 문자도 포함되어 있지 않는 경우
    • 원래 암호의 문자가 모두 대문자인 경우
    서버 A와 서버 B의 정렬 순서 모두 대/소문자를 구분하거나 서버 A와 서버 B의 정렬 순서 모두 대/소문자를 구분하지 않을 수 있습니다. 이러한 경우에는 문제가 발생하지 않습니다.
  • 서버 B의 인스턴스에 이미 있는 로그인의 이름이 출력 스크립트에 있는 이름과 같을 수 있습니다. 이 경우 서버 B의 인스턴스에서 출력 스크립트를 실행하면 다음과 같은 오류 메시지가 나타납니다.
    메시지 15025, 수준 16, 상태 1, 줄 1
    서버 보안 주체 'MyLogin'이(가) 이미 있습니다.
    마찬가지로 서버 B의 인스턴스에 이미 있는 로그인의 SID가 출력 스크립트에 있는 SID와 같을 수 있습니다. 이 경우 서버 B의 인스턴스에서 출력 스크립트를 실행하면 다음과 같은 오류 메시지가 나타납니다.
    메시지 15433, 수준 16, 상태 1, 줄 1
    제공한 매개 변수 SID가 사용 중입니다.
    따라서 다음을 수행해야 합니다.
    1. 출력 스크립트를 자세히 검토합니다.
    2. 서버 B의 인스턴스에서 sys.server_principals 뷰의 내용을 조사합니다.
    3. 이러한 오류 메시지를 적절하게 해결합니다.
  • SQL Server 2005에서 로그인의 SID는 데이터베이스 수준 액세스를 구현하기 위한 기본 요소로 사용됩니다. 한 서버에 있는 서로 다른 두 데이터베이스에 동일한 로그인에 대해 서로 다른 SID가 있을 수 있습니다. 이 경우 로그인은 sys.server_principals 뷰에 있는 SID와 일치하는 SID가 있는 데이터베이스에만 액세스할 수 있습니다. 이 문제는 두 데이터베이스가 서로 다른 두 서버에서 통합된 경우 발생할 수 있습니다. 이 문제를 해결하려면 DROP USER 문을 사용하여 SID가 일치하지 않는 데이터베이스에서 로그인을 수동으로 제거한 다음 CREATE USER 문을 사용하여 로그인을 다시 추가합니다.

참조

분리된 사용자 문제를 해결하는 방법에 대한 자세한 내용은 다음 MSDN(Microsoft Developer Network) 웹 사이트를 참조하십시오.
http://msdn2.microsoft.com/ko-kr/library/ms175475.aspx
CREATE LOGIN 문에 대한 자세한 내용은 다음 MSDN 웹 사이트를 참조하십시오.
http://msdn2.microsoft.com/ko-kr/library/ms189751.aspx
ALTER LOGIN 문에 대한 자세한 내용은 다음 MSDN 웹 사이트를 참조하십시오.
http://msdn2.microsoft.com/ko-kr/library/ms189828.aspx




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 918992 - 마지막 검토: 2013년 7월 16일 화요일 - 수정: 3.2
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
키워드:?
kbsqlmanagementtools kbexpertiseadvanced kbhowto kbinfo KB918992

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com