CLR 통합 개요
적용 대상: SQL Server Azure SQL Managed Instance
CLR(공용 언어 런타임)은 Microsoft .NET Framework의 핵심으로, 모든 .NET Framework 코드에 실행 환경을 제공합니다. CLR 내에서 실행되는 코드를 관리 코드라고 합니다. CLR에서는 JIT(Just-In-Time) 컴파일, 메모리 할당 및 관리, 형식 안전성 적용, 예외 처리, 스레드 관리 및 보안 같은 프로그램 실행을 위한 다양한 기능과 서비스를 제공합니다. 자세한 내용은 .NET Framework 개발 가이드를 참조 하세요.
참고 항목
SQL Server 언어 확장에서 새 .NET을 사용하는 방법에 대한 자세한 내용은 SQL Server 언어 확장에서 .NET 런타임을 호출하는 방법을 참조 하세요.
SQL Server에서 호스트되는 CLR(CLR 통합이라고 함)을 사용하여 관리 코드에서 저장 프로시저, 트리거, 사용자 정의 함수, 사용자 정의 형식 및 사용자 정의 집계를 작성할 수 있습니다. 관리 코드는 실행 전에 네이티브 코드로 컴파일되므로 일부 시나리오에서 상당한 성능 향상을 달성할 수 있습니다.
코드 액세스 보안
SQL Server 2016(13.x) 및 이전 버전에서 CAS(코드 액세스 보안)는 어셈블리가 특정 작업을 수행하지 못하도록 방지했습니다.
CLR은 더 이상 보안 경계로 지원되지 않는 .NET Framework의 CAS(코드 액세스 보안)를 사용합니다. 생성된 PERMISSION_SET = SAFE
CLR 어셈블리는 외부 시스템 리소스에 액세스하고, 관리되지 않는 코드를 호출하고, sysadmin 권한을 획득할 수 있습니다. SQL Server 2017(14.x) 이상 버전 sp_configure
에서 clr strict 보안 옵션은 CLR 어셈블리의 보안을 향상시킵니다. clr strict security
는 기본적으로 사용되며 SAFE
및 EXTERNAL_ACCESS
어셈블리가 UNSAFE
로 표시된 것처럼 처리됩니다. 이전 버전과의 호환성을 위해 이 clr strict security
옵션을 사용하지 않도록 설정할 수 있지만 권장되지는 않습니다.
데이터베이스에 권한이 부여된 UNSAFE ASSEMBLY
해당 로그인을 사용하여 인증서 또는 비대칭 키로 모든 어셈블리에 master
서명하는 것이 좋습니다. 또한 SQL Server 관리자는 데이터베이스 엔진에서 신뢰해야 하는 어셈블리 목록에 어셈블리를 추가할 수도 있습니다. 자세한 내용은 sys.sp_add_trusted_assembly를 참조하세요.
CLR 통합의 장점
Transact-SQL은 데이터베이스에서 직접 데이터 액세스 및 조작을 위해 설계되었습니다. Transact-SQL은 데이터 액세스 및 관리에서 탁월하지만 본격적인 프로그래밍 언어는 아닙니다. 예를 들어 Transact-SQL은 배열, 컬렉션, for-each 루프, 비트 시프트 또는 클래스를 지원하지 않습니다. 이러한 구문 중 일부는 Transact-SQL에서 시뮬레이션할 수 있지만 관리 코드는 이러한 구문에 대한 통합 지원을 제공합니다. 시나리오에 따라 이러한 기능은 관리 코드에서 특정 데이터베이스 기능을 구현하는 강력한 이유를 제공할 수 있습니다.
Visual Basic 및 C#은 캡슐화, 상속 및 다형성과 같은 개체 지향 기능을 제공합니다. 이제 관련 코드를 클래스 및 네임스페이스로 쉽게 구성할 수 있습니다. 많은 양의 서버 코드를 사용하는 경우 이러한 기능을 사용하면 코드를 보다 쉽게 구성하고 유지 관리할 수 있습니다.
관리 코드는 계산 및 복잡한 실행 논리에 Transact-SQL보다 더 적합하며 문자열 처리 및 정규식을 비롯한 많은 복잡한 작업을 광범위하게 지원합니다. .NET Framework 라이브러리에 있는 기능을 사용하면 수천 개의 미리 빌드된 클래스 및 루틴에 액세스할 수 있습니다. 이러한 클래스는 저장 프로시저, 트리거 또는 사용자 정의 함수에서 쉽게 액세스할 수 있습니다. BCL(기본 클래스 라이브러리)에는 문자열 조작, 고급 수학 연산, 파일 액세스, 암호화 등에 대한 기능을 제공하는 클래스가 포함되어 있습니다.
참고 항목
이러한 클래스의 대부분은 SQL Server의 CLR 코드 내에서 사용할 수 있지만 서버 쪽 사용(예: 창 클래스)에 적합하지 않은 클래스는 사용할 수 없습니다. 자세한 내용은 지원되는 .NET Framework 라이브러리를 참조 하세요.
관리 코드의 이점 중 하나는 코드가 잘 정의된 허용 가능한 방식으로만 형식에 액세스하도록 하는 형식 안전성입니다. 관리 코드가 실행되기 전에 CLR은 코드가 안전한지 확인합니다. 예를 들어 이전에 작성되지 않은 메모리를 읽지 않도록 코드를 확인합니다. CLR은 코드가 관리되지 않는 메모리를 조작하지 않도록 하는 데도 도움이 될 수 있습니다.
CLR 통합은 성능 향상을 위한 잠재력을 제공합니다. 자세한 내용은 CLR 통합 아키텍처의 성능을 참조 하세요.
Transact-SQL과 관리 코드 중에서 선택
저장 프로시저, 트리거 및 사용자 정의 함수를 작성할 때 기존 Transact-SQL을 사용할지 아니면 Visual Basic 또는 C#과 같은 .NET Framework 언어를 사용할지 결정해야 합니다. 코드가 주로 절차 논리를 거의 또는 전혀 사용하지 않고 데이터 액세스를 수행하는 경우 Transact-SQL을 사용합니다. 복잡한 논리를 특징으로 하는 CPU 집약적 함수 및 프로시저 또는 .NET Framework의 BCL을 사용하려는 경우 관리 코드를 사용합니다.
서버의 실행과 클라이언트의 실행 중에서 선택
Transact-SQL 또는 관리 코드를 사용할지 여부에 대한 결정의 또 다른 요소는 코드, 서버 컴퓨터 또는 클라이언트 컴퓨터를 상주하려는 위치입니다. Transact-SQL 및 관리 코드는 모두 서버에서 실행할 수 있습니다. 이렇게 하면 코드와 데이터를 함께 닫고 서버의 처리 능력을 활용할 수 있습니다. 반면에 데이터베이스 서버에 프로세서 집약적 작업을 배치하지 않도록 할 수 있습니다. 오늘날 대부분의 클라이언트 컴퓨터는 강력하며 클라이언트에 가능한 한 많은 코드를 배치하여 이 처리 능력을 활용할 수 있습니다. 관리 코드는 클라이언트 컴퓨터에서 실행할 수 있지만 Transact-SQL은 실행할 수 없습니다.
확장 저장 프로시저와 관리 코드 중에서 선택
Transact-SQL 저장 프로시저를 사용할 수 없는 기능을 수행하도록 확장 저장 프로시저를 빌드할 수 있습니다. 그러나 확장 저장 프로시저는 SQL Server 프로세스의 무결성을 손상시킬 수 있지만 형식이 안전한 것으로 확인된 관리 코드는 손상될 수 없습니다. 또한 메모리 관리, 스레드 및 파이버 예약 및 동기화 서비스는 CLR과 SQL Server의 관리 코드 간에 보다 긴밀하게 통합됩니다. CLR 통합을 사용하면 Transact-SQL에서 불가능한 작업을 수행하는 데 필요한 저장 프로시저를 작성하는 확장 저장 프로시저보다 더 안전한 방법이 있습니다. CLR 통합 및 확장 저장 프로시저에 대한 자세한 내용은 CLR 통합 아키텍처의 성능을 참조 하세요.