기존 CLR 개체를 실행하거나 어셈블리를 만들 때 오류 발생

이 문서에서는 다른 instance SQL Server 이동한 데이터베이스에서 CLR 개체로 작업할 때 발생할 수 있는 두 가지 문제를 resolve 수 있습니다.

원래 제품 버전: SQL Server
원래 KB 번호: 918040

증상

다음 시나리오를 고려하세요. SQL Server instance 있는 데이터베이스를 분리하거나 백업합니다. SQL Server instance 서버 A에서 실행됩니다. 나중에 서버 B에서 실행되는 SQL Server instance 해당 데이터베이스를 연결하거나 복원합니다. 이 시나리오에서는 다음과 같은 증상이 발생할 수 있습니다.

  • 서버 B에 있는 데이터베이스에서 또는 안전하지 않은 사용 권한이 설정된 기존 CLR(공용 언어 런타임) 개체 external_access 를 실행하려고 하면 다음 오류 메시지가 표시됩니다.

    Msg 10314, 수준 16, 상태 11, 줄 2
    어셈블리 ID 65536을 로드하는 동안 Microsoft .NET Framework 오류가 발생했습니다. 서버에 리소스가 부족하거나 어셈블리를 PERMISSION_SET = EXTERNAL_ACCESS 또는 UNSAFE로 신뢰할 수 없습니다. 쿼리를 다시 실행하거나 설명서를 검사 어셈블리 신뢰 문제를 해결하는 방법을 확인합니다. 이 오류에 대한 자세한 내용은 다음을 수행합니다.
    System.IO.FileLoadException: 파일 또는 어셈블리 'AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 또는 해당 종속성 중 하나를 로드할 수 없습니다. 보안과 관련된 오류가 발생했습니다. (HRESULT에서 예외: 0x8013150A) System.IO.FileLoadException:
    에서 System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)의 assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) at System.Reflection.Assembly.Load(String assemblyString)

  • 동일한 데이터베이스에 또는 안전하지 않은 사용 권한이 설정된 새 어셈블리 external_access 를 만들려고 하면 다음 오류 메시지가 표시됩니다.

    서버: Msg 10327, 수준 14, 상태 1, 줄 1
    어셈블리 'AssemblyName' 어셈블리 'AssemblyName'에 대한 권한이 PERMISSION_SET = EXTERNAL_ACCESS 대한 권한이 없으므로 어셈블리 'AssemblyName'에 대한 CREATE ASSEMBLY가 실패했습니다. DBO(데이터베이스 소유자)에 EXTERNAL ACCESS ASSEMBLY 권한이 있고 데이터베이스에 TRUSTWORTHY 데이터베이스 속성이 있는 경우 어셈블리에 권한이 부여됩니다. 또는 어셈블리가 EXTERNAL ACCESS ASSEMBLY 권한이 있는 해당 로그인이 있는 인증서 또는 비대칭 키로 서명됩니다.

데이터베이스 속성을 이미 ON으로 설정한 Trustworthy 경우에도 문제가 발생합니다.

원인

이 문제는 서버 A에서 데이터베이스를 만드는 데 사용하는 로그인이 서버 B의 SQL Server instance 없기 때문에 발생합니다. 이 로그인은 Microsoft Windows 로그인 또는 SQL Server 로그인일 수 있습니다.

해결 방법

이 문제를 해결하려면 다음 방법 중 하나를 사용합니다.

참고

다음 메서드를 사용하기 전에 데이터베이스 속성을 사용하도록 설정 Trustworthy 해야 합니다.

  • 저장 프로시저를 sp_changedbowner 사용하여 데이터베이스 소유자를 sa 로 변경하거나 서버 B에서 사용 가능한 로그인으로 변경합니다. 예를 들어 다음 문을 사용하여 데이터베이스 소유자를 sa로 변경할 수 있습니다.

    USE <DatabaseName>
    GO
    
    EXEC sp_changedbowner 'sa'
    

    참고

    이 문에서 는 <DatabaseName> 작업 중인 데이터베이스 이름의 자리 표시자입니다. 변경된 데이터베이스 소유자에게 특정 작업을 수행할 수 있는 해당 권한이 있어야 합니다. 예를 들어 데이터베이스 소유자는 어셈블리를 만들 수 있는 CREATE ASSEMBLY 권한이 있어야 합니다.

  • 서버 B의 SQL Server instance 데이터베이스를 만드는 데 사용되는 서버 A의 SQL Server instance 로그인을 추가합니다.

로그인이 도메인 계정인 경우 서버 B에서 동일한 로그인을 만들 수 있습니다. 그런 다음 서버 B에서 SQL Server instance 로그인에 필요한 권한을 부여합니다.

로그인이 SQL Server 로그인인 경우 이 로그인의 SID가 서버 B의 SQL Server instance 만든 새 SQL Server 로그인과 일치하는지 확인합니다. 이렇게 하려면 문의 SID 인수를 지정합니다CREATE LOGIN.

추가 정보

다른 데이터베이스에서 CLR 개체에 액세스하고 해당 데이터베이스에 DBO SID가 일치하지 않는 경우 동일한 문제가 발생할 수 있습니다.

자세한 내용은 CSS SQL Server 엔지니어 블로그를 참조하세요.

참조