다음을 통해 공유


고유하게 컴파일된 저장 프로시저 만들기

고유하게 컴파일된 저장 프로시저는 전체 Transact-SQL 프로그래밍 기능 및 쿼리 노출 영역을 구현하지 않습니다. 고유하게 컴파일된 저장 프로시저 내에서 사용할 수 없는 특정 Transact-SQL 구문이 있습니다. 자세한 내용은 고유하게 컴파일된 저장 프로시저에서 지원되는 구문을 참조하세요.

그러나 고유하게 컴파일된 저장 프로시저에 대해서만 지원되는 몇 가지 Transact-SQL 기능이 있습니다.

  • ATOMIC 블록 자세한 내용은 Atomic Blocks을(를) 참조하십시오.

  • 고유하게 컴파일된 저장 프로시저에서 매개 변수와 변수에 대한 NOT NULL 제약 조건. NULL 값을 NOT 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 저장 프로시저가 고유하게 컴파일된 저장 프로시저임을 나타냅니다. 다음 옵션이 필요합니다.

옵션 Description
SCHEMABINDING 고유하게 컴파일된 저장 프로시저는 참조하는 개체의 스키마에 바인딩되어야 합니다. 이는 프로시저에서 참조하는 테이블을 삭제할 수 없음을 의미합니다. 프로시저에서 참조되는 테이블에는 해당 스키마 이름을 포함해야 하며 쿼리에 와일드카드(*)를 사용할 수 없습니다. SCHEMABINDING는 이 버전의 SQL Server 고유하게 컴파일된 저장 프로시저에 대해서만 지원됩니다.
EXECUTE AS 고유하게 컴파일된 저장 프로시저는 기본 실행 컨텍스트인 EXECUTE AS CALLER를 지원하지 않습니다. 따라서 실행 컨텍스트를 지정해야 합니다. 옵션 EXECUTE AS OWNER, EXECUTE AS사용자EXECUTE AS SELF 가 지원됩니다.
BEGIN ATOMIC 고유하게 컴파일된 저장 프로시저의 본문은 단 하나의 ATOMIC 블록으로 구성되어야 합니다. ATOMIC 블록은 저장 프로시저의 원자성 실행을 보장합니다. 프로시저가 활성 트랜잭션의 컨텍스트 외부에서 호출되면 새 트랜잭션을 시작하며 ATOMIC 블록의 끝에서 커밋합니다. 고유하게 컴파일된 저장 프로시저의 ATOMIC 블록에는 다음과 같은 두 가지 필수 옵션이 있습니다.

TRANSACTION ISOLATION LEVEL. 지원되는 격리 수준은 트랜잭션 격리 수준을 참조하세요.

LANGUAGE. 저장 프로시저의 언어는 사용 가능한 언어 또는 언어 별칭 중 하나로 설정되어야 합니다.

EXECUTE AS 및 Windows 로그인과 관련하여 EXECUTE AS를 통해 수행된 가장 때문에 오류가 발생할 수 있습니다. 사용자 계정이 Windows 인증을 사용하는 경우 SQL Server instance 사용되는 서비스 계정과 Windows 로그인 도메인 간에 완전 신뢰가 있어야 합니다. 완전 신뢰가 없는 경우 고유하게 컴파일된 저장 프로시저를 만들 때 다음 오류 메시지가 반환됩니다. Msg 15404, Windows NT 그룹/사용자 '사용자 이름'에 대한 정보를 가져올 수 없음, 오류 코드 0x5.

이 오류를 해결하려면 다음 중 하나를 사용합니다.

  • Windows 사용자와 동일한 도메인에 있는 계정을 SQL Server 서비스에 사용합니다.

  • SQL Server 네트워크 서비스 또는 로컬 시스템과 같은 컴퓨터 계정을 사용하는 경우 Windows 사용자를 포함하는 도메인에서 컴퓨터를 신뢰할 수 있어야 합니다.

  • SQL Server 인증을 사용합니다.

고유하게 컴파일된 저장 프로시저를 만들 때 오류 15517이 나타날 수도 있습니다. 자세한 내용은 MSSQLSERVER_15517 참조하세요.

고유하게 컴파일된 저장 프로시저 업데이트

고유하게 컴파일된 저장 프로시저에 대한 변경 작업 수행은 지원되지 않습니다. 고유하게 컴파일된 저장 프로시저를 수정하는 한 가지 방법은 저장 프로시저를 삭제하고 다시 만드는 것입니다.

  1. 저장 프로시저 사용 권한에 대한 스크립트를 생성합니다.

  2. 선택적으로 저장 프로시저에 대한 스크립트를 생성하고 백업으로 저장합니다.

  3. 저장 프로시저를 삭제합니다.

  4. 변경된 저장 프로시저를 만듭니다.

  5. 스크립팅된 사용 권한을 저장 프로시저에 다시 적용합니다.

이 절차의 단점은 3단계 시작과 5단계 완료 사이에 오프라인 시간이 있다는 것입니다. 이 작업은 몇 초 정도 걸릴 수 있으며 애플리케이션을 사용하는 클라이언트에 오류 메시지가 표시될 수 있습니다.

고유하게 컴파일된 저장 프로시저를 효과적으로 수정하는 다른 방법은 먼저 저장 프로시저의 새 버전을 만드는 것입니다. 여기서 고유하게 컴파일된 저장 프로시저에는 연결된 버전 번호가 있습니다. 기존 버전을 SP_Vold라고 하고 새 버전을 SP_Vnew라고 합니다.

  1. SP_Vold의 사용 권한에 대한 스크립트를 생성합니다.

  2. SP_Vnew를 만듭니다.

  3. SP_Vold의 사용 권한을 SP_Vnew에 적용합니다.

  4. SP_Vnew를 가리키도록 SP_Vold에 대한 참조를 업데이트합니다. 이 작업은 다음과 같은 다양한 방법으로 수행할 수 있습니다.

    래퍼(디스크 기반) 저장 프로시저를 사용하고 SP_Vnew를 가리키도록 해당 프로시저를 변경합니다. 이 방법의 단점은 간접 참조가 성능에 미치는 영향입니다.

    ALTER PROCEDURE dbo.SP p1,...,pn  
    AS  
      EXEC dbo.SP_Vnew p1,...,pn  
    GO  
    
  5. 선택적으로 SP_Vold를 삭제합니다.

이 방법의 장점은 애플리케이션이 오프라인으로 전환되지 않는다는 것입니다. 하지만 참조를 유지하고 참조가 항상 최신 버전의 저장 프로시저를 가리키는지 확인하는 데 더 많은 작업이 필요합니다.

참고 항목

고유하게 컴파일된 저장 프로시저