SQL 버전과 CLR (.NET Framework 버전에 따른 오류)
- Version : SQL Server 2005, 2008, 2008R2, 2012
SQL Server 2005 버전부터 CLR을 지원하고 있다. 최근 SQL Server 2012버전으로 업그레이드 후 CLR을 사용하는 시스템에서 다음과 같은 오류를 발견 할 수 있다.
Msg 6544, Level 16, State 1, Line 2 CREATE ASSEMBLY for assembly '<assembly name>' failed because assembly '<assembly name>' is malformed or not a pure .NET assembly. Unverifiable PE Header/native stub. |
.NET 어셈블리에는 두 가지 유형이 있다. .NET 어셈블리는 MSIL 명령이 포함되어 있다. 혼합 어셈블리는 관리되지 않은 기계 명령어 및 MSIL 명령이 모두 포함되어 있다. 일반적으로 혼합 어셈블리로 컴파일 된 C++ 컴파일러를 CLR 스위치로 변경할 때 네이티브 코드로 인한 기계 명령어가 포함된다.
SQL Server는 버전에 관계 없이 .NET 어셈블리를 등록할 수 있다. SQL Server는 CREATE ASSEMBLY를 사용하여 SQL Server 데이터베이스에 로드 할 어셈블리 MSIL 명령어를 요구한다. 등록 할 어셈블리가 혼합 된 어셈블리의 경우 CREATE ASSEMBLY는 위와 같은 오류가 발생 한다.
SQL Server 2005, 2008, 2008r2 버전에서는 CLR 2.0을 사용한다. SQL Server 2012의 CLR 4.0 버전을 사용한다. 결과적으로 모든 .NET Framework 어셈블리 버전은 4.0에서 해야 한다.
.NET Framework 4.0 어셈블리는 WCF와 같은 혼합 모드 어셈블리를 참조한다. 따라서 지원 목록에 없는 .NET Framework 어셈블리를 사용하는 경우 업그레이드 후 CREATE ASSEMBLY 문을 사용하여 4.0 버전을 다시 등록해야 한다.
등록하려는 어셈블리가 순수 .NET 어셈블리가 아닌 경우 .NET Framework 의 모든 버전에서 발생 할 수 있다. 또한 새로운 버전의 어셈블리가 순수 하지 않은 .NET 어셈블리를 참조 할 수 있다. 이러한 상황에서 업그레이드 할 경우 오류와 함께 실패 한다.
[참고자료]
- CSS SQL Server Engineers Team Blog :
- SQL Server CLR 소개 : http://msdn.microsoft.com/ko-kr/library/ms254498.aspx
강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp