고유하게 컴파일된 저장 프로시저는 전체 Transact-SQL 프로그래밍 기능 및 쿼리 노출 영역을 구현하지 않습니다. 고유하게 컴파일된 저장 프로시저 내에서 사용할 수 없는 특정 Transact-SQL 구문이 있습니다. 자세한 내용은 고유하게 컴파일된 저장 프로시저에서 지원되는 구문을 참조하세요.
그러나 고유하게 컴파일된 저장 프로시저에 대해서만 지원되는 몇 가지 Transact-SQL 기능이 있습니다.
원자성 블록. 자세한 내용은 Atomic 블록을 참조하세요.
NOT NULL고유하게 컴파일된 저장 프로시저의 매개 변수 및 변수에 대한 제약 조건입니다. 당신은NOT NULL로 선언된 매개 변수 또는 변수에NULL값을 할당할 수 없습니다. 자세한 내용은 DECLARE @local_variable (Transact-SQL)를 참조하세요.고유하게 컴파일된 저장 프로시저의 스키마 바인딩입니다.
고유하게 컴파일된 저장 프로시저는 CREATE PROCEDURE(Transact-SQL)를 사용하여 생성됩니다. 다음 예제에서는 메모리 최적화 테이블과 테이블에 행을 삽입하는 데 사용되는 고유하게 컴파일된 저장 프로시저를 보여 줍니다.
create table dbo.Ord
(OrdNo integer not null primary key nonclustered,
OrdDate datetime not null,
CustCode nvarchar(5) not null)
with (memory_optimized=on)
go
create procedure dbo.OrderInsert(@OrdNo integer, @CustCode nvarchar(5))
with native_compilation, schemabinding, execute as owner
as
begin atomic with
(transaction isolation level = snapshot,
language = N'English')
declare @OrdDate datetime = getdate();
insert into dbo.Ord (OrdNo, CustCode, OrdDate) values (@OrdNo, @CustCode, @OrdDate);
end
go
코드 샘플 NATIVE_COMPILATION 에서 이 Transact-SQL 저장 프로시저는 고유하게 컴파일된 저장 프로시저임을 나타냅니다. 다음 옵션이 필요합니다.
| 옵션 | 설명 |
|---|---|
SCHEMABINDING |
고유하게 컴파일된 저장 프로시저는 참조하는 개체의 스키마에 바인딩되어야 합니다. 즉, 프로시저의 테이블 참조를 삭제할 수 없습니다. 프로시저에서 참조되는 테이블에는 해당 스키마 이름이 포함되어야 하며 쿼리에서는 와일드카드(*)가 허용되지 않습니다.
SCHEMABINDING 는 이 버전의 SQL Server에서 고유하게 컴파일된 저장 프로시저에 대해서만 지원됩니다. |
EXECUTE AS |
네이티브로 컴파일된 저장 프로시저는 기본 실행 컨텍스트인 EXECUTE AS CALLER을 지원하지 않습니다. 따라서 실행 컨텍스트를 지정해야 합니다. 옵션 EXECUTE AS OWNER, EXECUTE AS사용자 및 EXECUTE AS SELF 지원됩니다. |
BEGIN ATOMIC |
고유하게 컴파일된 저장 프로시저 본문은 정확히 하나의 원자성 블록으로 구성되어야 합니다. 원자성 블록은 저장 프로시저의 원자성 실행을 보장합니다. 프로시저가 활성 트랜잭션의 컨텍스트 외부에서 호출되면 원자성 블록의 끝에 커밋되는 새 트랜잭션이 시작됩니다. 고유하게 컴파일된 저장 프로시저의 원자성 블록에는 다음 두 가지 필수 옵션이 있습니다.TRANSACTION ISOLATION LEVEL;
트랜잭션 격리 수준에서 지원되는 격리 수준을 참조하세요.LANGUAGE; 저장 프로시저의 언어는 사용 가능한 언어 또는 언어 별칭 중 하나로 설정해야 합니다. |
EXECUTE AS 및 Windows 로그인과 관련하여 EXECUTE AS를 통해 수행된 가장으로 인해 오류가 발생할 수 있습니다. 사용자 계정이 Windows 인증을 사용하는 경우 SQL Server 인스턴스에 사용되는 서비스 계정과 Windows 로그인 도메인 간에 완전 신뢰가 있어야 합니다. 완전 신뢰가 없는 경우 고유하게 컴파일된 저장 프로시저를 만들 때 다음 오류 메시지가 반환됩니다. Msg 15404, Windows NT 그룹/사용자 'username'에 대한 정보를 가져올 수 없음, 오류 코드 0x5.
이 오류를 해결하려면 다음 중 하나를 사용합니다.
SQL Server 서비스에 대한 Windows 사용자와 동일한 도메인의 계정을 사용합니다.
SQL Server가 네트워크 서비스 또는 로컬 시스템과 같은 컴퓨터 계정을 사용하는 경우 Windows 사용자를 포함하는 도메인에서 컴퓨터를 신뢰해야 합니다.
SQL Server 인증을 사용합니다.
고유하게 컴파일된 저장 프로시저를 만들 때 오류 15517이 표시될 수도 있습니다. 자세한 내용은 MSSQLSERVER_15517 참조하세요.
고유하게 컴파일된 저장 프로시저 업데이트
고유하게 컴파일된 저장 프로시저에서 변경 작업을 수행하는 것은 지원되지 않습니다. 고유하게 컴파일된 저장 프로시저를 수정하는 한 가지 방법은 저장 프로시저를 삭제하고 다시 만드는 것입니다.
저장 프로시저에 대한 권한에 대한 스크립트를 생성합니다.
선택 사항으로 저장 프로시저에 대한 스크립트를 생성하고 백업으로 저장합니다.
저장 프로시저를 삭제합니다.
변경된 저장 프로시저를 만듭니다.
저장 프로시저에 스크립트된 권한을 다시 적용합니다.
이 절차의 단점은 애플리케이션이 3단계 시작부터 5단계 완료까지 오프라인 상태라는 점입니다. 몇 초 정도 걸릴 수 있으며 애플리케이션을 사용하는 클라이언트에 오류 메시지가 표시 될 수 있습니다.
고유하게 컴파일된 저장 프로시저를 효과적으로 수정하는 또 다른 방법은 먼저 저장 프로시저의 새 버전을 만드는 것입니다. 여기서 고유하게 컴파일된 저장 프로시저에는 연결된 버전 번호가 있습니다. 이전 버전 SP_Vold 새 버전 SP_Vnew 호출합니다.
SP_Vold 권한에 대한 스크립트를 생성합니다.
SP_Vnew 만듭니다.
SP_Vold의 권한을 SP_Vnew에 적용합니다.
SP_Vold에 대한 참조를 SP_Vnew로 업데이트합니다. 이 작업은 다음과 같은 다양한 방법으로 수행할 수 있습니다.
래퍼(디스크 기반) 저장 프로시저를 사용하고 SP_Vnew 가리키도록 해당 프로시저를 변경합니다. 이 방법의 단점은 간접 참조의 성능 영향입니다.
ALTER PROCEDURE dbo.SP p1,...,pn AS EXEC dbo.SP_Vnew p1,...,pn GO선택 사항으로 SP_Vold 삭제합니다.
이 방법의 장점은 애플리케이션이 오프라인 상태가 되지 않는다는 것입니다. 그러나 참조를 유지하고 항상 저장 프로시저의 최신 버전을 가리키도록 하려면 더 많은 작업이 필요합니다.