Access 프로젝트 및 SQL Server 2000 Desktop Edition에서 응용 프로그램 역할을 사용하는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 308312 - 이 문서가 적용되는 제품 보기.
고급: 전문적인 코드 작성, 상호 운용성 및 다중 사용자 기술이 필요합니다.

이 문서의 내용은 Microsoft Access 프로젝트(.adp)에만 적용됩니다.

모두 확대 | 모두 축소

요약

이 문서에서는 Microsoft Access 프로젝트(ADP)에서 Microsoft SQL Server 응용 프로그램 역할을 사용할 때 가능한 기능, 한계 및 해결 방법에 대해 설명합니다.

추가 정보

SQL Server에서는 데이터베이스에서 권한을 쉽게 관리하기 위해 데이터베이스 역할을 만들 수 있습니다. 각 사용자에게 개별적으로 권한을 부여하는 대신 같은 권한을 필요로 하는 사용자를 동일한 일반 데이터베이스 역할의 구성원으로 그룹화한 다음 데이터베이스 역할 자체에 권한을 할당할 수 있습니다. 특정 권한이 다른 곳에서 명시적으로 거부되지 않는 한 구성원인 사용자는 해당 데이터베이스 역할에 부여된 권한을 얻게 됩니다.

일반 데이터베이스 역할은 사용자가 자신의 임의(Ad-hoc) 쿼리를 수행하거나 데이터베이스를 업데이트할 수 있게 하려는 경우에는 매우 유용하지만 항상 적절한 것은 아닙니다. 어떤 경우에는 사용자가 특정 응용 프로그램을 사용할 때만 특정 권한을 갖도록 하고 해당 응용 프로그램 외부에서는 데이터를 보거나 수정하지 못하도록 할 수도 있습니다.

이를 위해 흔히 사용하는 한 가지 방법은 한 SQL Server 사용자 계정에만 필요한 권한을 제공하는 것입니다. 실제 사용자는 데이터베이스에 연결하는 권한이 있고 데이터를 보거나 수정하는 권한은 없을 수 있습니다. 사용자가 개별 계정을 사용하여 데이터베이스에 연결하면 ADP가 권한을 가진 사용자 계정의 자격 증명을 사용하여 프로그래밍 방식으로 다시 연결할 수 있습니다. 이 방법은 효과적일 수 있으나 데이터베이스에서 사용자를 구별하거나 특정 작업을 수행한 사용자를 확인할 수는 없습니다.

응용 프로그램 역할은 이러한 한계를 극복하기 위해 설계되었습니다. 일반 데이터베이스 역할과 달리 응용 프로그램 역할에는 구성원이 없습니다. 대신, 사용자는 자신의 자격 증명을 사용하여 SQL Server에 로그온하고 데이터베이스에 연결합니다. 이때 sp_setapprole 저장 프로시저를 사용하여 응용 프로그램 역할의 보안 컨텍스트가 프로그래밍 방식으로 기존 연결에 적용될 수 있습니다. SQL Server에서 개별 사용자는 여전히 구별되지만 특정 연결에서 사용할 수 있는 권한은 응용 프로그램 역할의 권한으로만 제한됩니다. 사용자의 개별 권한은 응용프로그램 역할의 권한보다 크든 작든 간에 더 이상 고려되지 않습니다.

응용 프로그램 역할 만들기

Access 2002나 Access 2000 프로젝트에는 응용 프로그램 역할 같은 SQL Server 보안 개체를 만드는 비주얼 디자인 도구가 없습니다. 따라서 SQL Server나 Microsoft Office XP Developer의 일반 버전에 포함된 클라이언트 도구를 사용하여 응용 프로그램 역할을 만들고 권한을 할당하는 것이 좋습니다. 하지만 ADP에서 Transact-SQL(T-SQL)을 사용하여 프로그래밍 방식으로 응용 프로그램 권한을 만들고 필요한 권한을 부여할 수도 있습니다. SQL Server 보안에 대한 자세한 내용은 이 문서에서 다루지 않습니다. 자세한 내용은 SQL Server 온라인 설명서를 참조하시기 바랍니다. 프로그래밍 방식으로 응용 프로그램 역할을 만들고 새 역할에 테이블에 대한 선택 권한을 부여하는 절차는 다음과 같습니다.
  1. Access를 시작합니다.
  2. 도움말 메뉴에서 예제 데이터베이스를 가리킨 다음 Northwind 예제 Access 프로젝트를 누릅니다.
  3. 데이터베이스 창의 개체에서 모듈을 누른 다음 새로 만들기를 눌러서 Visual Basic 환경에서 새 모듈을 엽니다.
  4. 새 모듈에 다음 코드를 입력하거나 붙여 넣습니다.
    Public Function AddNewAppRole(RoleName As String, PW As String) As Boolean
    On Error GoTo EH:
    If CurrentProject.IsConnected Then
    Dim sTSQL As String
        'Create the command
    sTSQL = "EXEC sp_addapprole '" & RoleName & "','" & PW & "'"
        'Send the command
    Application.CurrentProject.Connection.Execute sTSQL
    AddNewAppRole = True
    Else
    AddNewAppRole = False
    End If
    Exit Function
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    AddNewAppRole = False
    End Function
    					
  5. 모듈을 저장한 다음 Visual Basic 환경을 종료합니다.
  6. Customers 테이블의 복사본을 만든 다음 tNewTable로 저장합니다.
    1. 데이터베이스 창에서 Customers 테이블을 마우스 오른쪽 단추로 누른 다음 바로 가기 메뉴에서 다른 이름으로 저장을 누릅니다.
    2. 다른 이름으로 저장 대화 상자에서 'Customers' 테이블 내보낼 위치 상자에 tNewTable을 입력한 다음 확인을 눌러서 새 테이블을 완성합니다.
  7. 데이터베이스 창의 개체에서 을 누르고 새로 만들기를 누른 다음 확인을 눌러서 디자인 보기에서 새 폼을 엽니다.
  8. 명령 단추를 새 폼에 추가합니다.
  9. 새 명령 단추의 OnClick 속성을 아래의 이벤트 프로시저로 설정합니다.
    On Error GoTo EH:
    'Code only works if ADP is connected.
    If CurrentProject.IsConnected Then
        Dim bNewAppRole As Boolean, strTSQL As String
        Dim strRoleName As String, strPW As String
        strRoleName = "AppRoleName"
        strPW = "Password"
        'Call function to create app role.
        bNewAppRole = AddNewAppRole(strRoleName, strPW)
        'Test to see if it failed.
        If bNewAppRole = False Then
            Exit Sub
        End If
        MsgBox "New Application role '" & strRoleName & "' created", vbInformation
        'Create command to grant permissions.
        strTSQL = "Grant Select on tNewTable to " & strRoleName
        'Send the command.
        Application.CurrentProject.Connection.Execute strTSQL
        MsgBox "Select permissions granted on tNewTable for " & strRoleName
    Else
    MsgBox "ADP must be connected to SQL Server"
    End If
    Exit Sub
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    					
  10. Visual Basic 환경을 닫고 폼으로 돌아옵니다.
  11. 폼을 저장한 다음 폼 보기로 폼을 전환합니다.
  12. 명령 단추를 눌러서 기본 코드를 실행합니다. 성공을 나타내는 메시지 상자 두 개가 표시됩니다. 첫 번째 메시지 상자는 응용 프로그램 역할이 만들어진 후 표시되고 두 번째는 tNewTable에 대한 새로운 역할 권한이 부여된 후에 표시됩니다.

응용 프로그램 역할 구현

Access 프로젝트에서 응용 프로그램 역할을 사용할 때의 주요 문제는 Access가 SQL Server에 대한 세 가지 연결을 사용하여 다양한 작업을 처리하는 것입니다. 응용 프로그램 역할을 전체 프로젝트에 적용하려면 세 가지 연결 모두의 컨텍스트에서 sp_setapprole을 실행하는 것이 가장 좋습니다. 각 연결의 용도는 다음과 같습니다.

  1. 데이터베이스 창에 나타나는 개체를 결정하고 기타 데이터베이스 관리 작업을 수행하는 데 사용

    폼과 하위 보고서(주 보고서는 제외)에 대한 레코드 원본, 테이블, 뷰, 저장 프로시저 및 함수를 여는 데 사용

    콤보 상자, 목록 상자 및 보고서에 대한 레코드 원본을 얻는 데 사용
  2. 폼과 하위 보고서(주 보고서는 제외)에 대한 레코드 원본, 테이블, 뷰, 저장 프로시저 및 함수를 여는 데 사용

    콤보 상자, 목록 상자 및 보고서에 대한 레코드 원본을 얻는 데 사용
  3. 콤보 상자, 목록 상자 및 보고서에 대한 레코드 원본을 얻는 데 사용

연결 #2와 #3에는 매우 쉽게 액세스할 수 있지만 연결 #1의 컨텍스트에서 저장 프로시저를 실행시킬 방법이 없습니다. 다행히 이 연결은 세 가지 연결 중 중요도가 가장 낮으므로 기본 제공 데이터베이스 창을 사용하는 대신 데이터베이스 개체를 제공하는 자체 사용자 인터페이스(예: 스위치보드 형식의 폼)를 만들어 문제를 쉽게 해결할 수 있습니다.

NorthwindCS 예제 프로젝트를 사용하여 연결 #2와 #3에 대한 응용 프로그램 역할을 적용하는 방법을 보여주는 절차는 다음과 같습니다.

  1. 데이터베이스 창의 개체에서 을 누르고 새로 만들기를 누른 다음 확인을 눌러 디자인 보기에서 새 폼을 엽니다.
  2. 새로 만든 폼에 목록 상자를 추가한 다음 목록 상자의 Name 속성을 lst_AppRole로 설정합니다.
  3. 명령 단추를 폼에 추가합니다.
  4. 새 명령 단추의 OnClick 속성을 아래의 이벤트 프로시저로 설정합니다.
    On Error GoTo EH
        'This avoids a message that no records were returned.
    DoCmd.SetWarnings False
    Dim TSQL
    TSQL = "EXEC sp_setapprole 'AppRoleName', {Encrypt N 'Password'}, 'odbc'"
        'This sets the app role on Connection #2.
    Application.CurrentProject.Connection.Execute TSQL
        'This sets the app role on Connection #3.
    lst_approle.RowSource = TSQL
    lst_approle.Requery
    DoCmd.SetWarnings True
    MsgBox "The application Role is now in effect.", vbInformation
    Exit Sub
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    					
  5. Visual Basic 환경을 닫고 폼으로 돌아옵니다.
  6. 폼을 저장한 다음 폼 보기로 폼을 전환합니다.
  7. 명령 단추를 눌러서 기본 코드를 실행합니다. 성공을 나타내는 메시지 상자 두 개가 표시됩니다.
  8. 데이터베이스 창의 개체에서 테이블을 누른 다음 tNewTable 테이블을 엽니다.
  9. 레코드를 수정하고 변경 사항을 저장해봅니다.
변경 사항을 적용하려고 하면 충분한 권한이 없다는 오류 메시지가 표시됩니다. 이러한 오류는 새 응용 프로그램 역할에서 tNewTable 테이블에 대한 선택 권한만 부여하고 업데이트 권한은 부여하지 않았기 때문에 발생합니다.

Access는 사용자가 적어도 선택 권한이나 실행 권한이 있는 개체만 데이터베이스 창에 표시하도록 의도적으로 설계되었습니다. Access는 연결 #1을 사용하여 사용자가 권한을 갖고 있는 개체를 결정합니다. 연결 #2와 #3에 응용 프로그램 역할을 적용한 후 사용자에게 더 이상 모든 개체에 대한 권한이 없거나 표시되지 않은 개체에 대한 권한이 더 있을 수 있지만 데이터베이스 창에는 여전히 이전과 같은 개체가 표시됩니다. 이로 인해 데이터베이스 창을 사용할 때 예기치 않은 동작이 발생할 수 있습니다.

예를 들어, tNewTable 테이블을 열면 사용자에게 레코드를 편집하고 삽입할 권한이 있는 것처럼 "보입니다". 테이블 맨 아래에 새 레코드 삽입 아이콘이 사용 가능하도록 설정되어 사용자는 편집 모드에서 레코드를 삽입할 수 있습니다. 편집이나 삽입을 적용하기 전까지는 적용할 수 없음을 나타내는 표시가 나타나지 않다가 적용하려고 하면 결국 오류 메시지가 나타납니다. Access는 사용자에게 실제로 권한이 없는데도 불구하고 권한이 있다고 간주합니다.

가장 효과적인 해결 방법은 사용자에게 사용자 지정 인터페이스를 제공하고 데이터베이스 창을 사용하지 않는 것입니다. 스위치보드 형식의 사용자 인터페이스를 사용하여 사용자가 액세스 권한을 가진 개체를 정확하게 제어할 수 있습니다.

기타 한계 및 보안 고려 사항

하위 폼이 작동하지 않음

다른 데이터베이스 개체와 달리 Access는 항상 같은 연결을 사용하여 하위 폼의 데이터 원본을 검색하지는 않습니다. Access는 항상은 아니지만 자주 SQL Server에 대한 새로운 연결을 만들어서 하위 폼 레코드 집합을 처리하거나 하위 폼을 기본 폼에 연결하는 연결 필드 데이터를 검색합니다. 이 새로운 연결에 응용 프로그램 역할이 적용되지 않았기 때문에 사용자가 데이터베이스 개체에 대한 명시적 권한이 없으면 권한 오류가 발생할 수 있습니다. 즉, 응용 프로그램 역할이 적용될 때 바운드 하위 폼을 안정적으로 사용할 수 있는 방법이 없습니다. 이 문제를 효과적으로 해결할 수 있는 유일한 방법은 데이터 조작은 프로그래밍 방식으로 처리하면서 완전히 언바운드 하위 폼을 사용하는 것입니다. 이것이 Access에서 응용 프로그램 역할을 사용할 때의 가장 심각한 한계입니다.

보고서가 작동하지 않음

보고서나 하위 보고서의 레코드 원본으로 나열된 테이블이나 보기 이름 같은 개체가 있는 경우 Access는 SQL Server에서 데이터를 검색하기 전에 데이터베이스 창에 개체가 나열되는지를 확인합니다. 데이터베이스 창이 응용 프로그램 역할이 적용되지 않은 연결을 사용하기 때문에 사용자에게 기본 데이터 원본에 대한 명시적 권한이 없으면 오류가 발생합니다.

이 문제를 해결하려면 폼과 보고서의 레코드 원본으로 항상 Transact-SQL 문을 사용하십시오. 예를 들어, "ViewName" 대신 "Select * from ViewName"을 사용하거나 "StoredProcedureName" 대신 "Exec StoredProcedureName"을 사용합니다. 이렇게 하면 Access가 Transact-SQL 문을 직접 SQL Server로 전달하고 응용 프로그램 역할의 권한을 기초로 데이터를 검색합니다.

공용 데이터베이스 역할

응용 프로그램 역할은 공용 데이터베이스 역할의 권한을 얻습니다. 기본적으로 NorthwindCS에서 공용 역할은 대부분의 개체에 대해 모든 권한이 있습니다. 따라서 응용 프로그램 역할은 일반적으로 효과가 없습니다. "응용 프로그램 역할 만들기" 절에서 tNewTable 테이블을 만들 때 테이블에 대한 권한이 공용 역할에 부여되지 않아서 나중에 해당 테이블에 대한 응용 프로그램 역할 보안 컨텍스트의 효과가 나타났습니다. 그러나 다른 테이블의 경우 해당 개체에 대한 권한이 공용 역할에 있으므로 응용 프로그램 역할에서 차이가 나타나지 않을 수 있습니다.

VBA 보안

응용 프로그램 역할의 암호는 응용 프로그램 역할을 호출한 응용 프로그램에 포함되어 있기 때문에 이러한 사실을 아는 사용자가 소스 코드에서 응용 프로그램 역할 이름과 암호를 읽은 다음 이 정보를 다른 응용 프로그램에서 SQL Server에 대한 액세스 권한을 얻기 위해 사용할 수 있습니다. 따라서 ADP를 ADE 파일로 컴파일하여 소스 코드를 볼 수 없게 하는 것이 좋습니다. 최소한 VBA 프로젝트에는 암호를 적용해야 합니다.

참조

이 문서의 Microsoft Access 2000 버전에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
318816 ACC2000: Access 프로젝트 및 SQL Server 2000 Desktop Engine(MSDE 2000)에서 응용 프로그램 역할을 사용하는 방법




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

속성

기술 자료: 308312 - 마지막 검토: 2003년 11월 6일 목요일 - 수정: 5.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
키워드:?
kbhowto KB308312

피드백 보내기

 

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