ネイティブ コンパイル ストアド プロシージャの作成
ネイティブ コンパイル ストアド プロシージャでは、完全な 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 ストアド プロシージャがネイティブ コンパイル ストアド プロシージャであることを示します。 以下のオプションは必須です。
オプション | 説明 |
---|---|
SCHEMABINDING |
ネイティブ コンパイル ストアド プロシージャは、参照するオブジェクトのスキーマにバインドする必要があります。 これは、プロシージャによるテーブル参照を削除できないことを意味します。 プロシージャ内で参照されているテーブルにはスキーマ名が含まれている必要があり、クエリでワイルドカード (*) は使用できません。 SCHEMABINDING は、このバージョンのSQL Serverのネイティブ コンパイル ストアド プロシージャでのみサポートされています。 |
EXECUTE AS |
ネイティブ コンパイル ストアド プロシージャでは、既定の実行コンテキストである EXECUTE AS CALLER はサポートされません。 したがって、実行コンテキストの指定は必須です。 オプション EXECUTE AS OWNER 、 EXECUTE AS ユーザー、および EXECUTE AS SELF がサポートされています。 |
BEGIN ATOMIC |
ネイティブ コンパイル ストアド プロシージャの本体は、厳密に 1 つの ATOMIC ブロックで構成されている必要があります。 ATOMIC ブロックでは、ストアド プロシージャのアトミック実行が保証されます。 プロシージャをアクティブなトランザクションのコンテキストの外部で呼び出した場合、新しいトランザクションが開始され、ATOMIC ブロックの末尾でコミットされます。 ネイティブ コンパイル ストアド プロシージャの ATOMIC ブロックには、次の 2 つの必須オプションがあります。TRANSACTION ISOLATION LEVEL . サポートされている 分離レベルについては、「トランザクション分離レベル 」を参照してください。LANGUAGE . ストアド プロシージャの言語は、使用可能な言語または言語の別名の 1 つに設定されている必要があります。 |
EXECUTE AS
と Windows ログインについては、EXECUTE AS
を通じて行われた権限借用によって、エラーが発生する場合があります。 ユーザー アカウントで Windows 認証を使用する場合は、SQL Server インスタンスに使用されるサービス アカウントと Windows ログインのドメインの間に完全な信頼が必要です。 完全な信頼がない場合は、ネイティブ コンパイル ストアド プロシージャを作成するときに、次のエラー メッセージが返されます。メッセージ 15404、Windows NT グループ/ユーザー 'username' に関する情報を取得できませんでした。エラー コード0x5。
このエラーを解決するには、次のいずれかを使用します。
SQL Server サービスの Windows ユーザーと同じドメインからのアカウントを使用します。
SQL Serverがネットワーク サービスやローカル システムなどのコンピューター アカウントを使用している場合は、Windows ユーザーを含むドメインによってマシンが信頼されている必要があります。
SQL Server認証を使用します。
ネイティブ コンパイル ストアド プロシージャを作成するときに、エラー 15517 が発生することもあります。 詳細については、「 MSSQLSERVER_15517」を参照してください。
ネイティブ コンパイル ストアド プロシージャの更新
ネイティブ コンパイル ストアド プロシージャに対する変更操作はサポートされていません。 ネイティブ コンパイル ストアド プロシージャを変更する方法の 1 つは、ストアド プロシージャを削除してから再作成することです。
ストアド プロシージャに対する権限用のスクリプトを生成します。
ストアド プロシージャ用のスクリプトを生成し、バックアップとして保存することもできます。
ストアド プロシージャを削除します。
変更したストアド プロシージャを作成します。
ストアド プロシージャにスクリプト化した権限を再適用します。
この手順の欠点は、手順 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 を削除することもできます。
この方法の利点は、アプリケーションがオフラインにならないことです。 しかし、参照の保持と、ストアド プロシージャの最新バージョンを常にポイントさせるために、より多くの作業が必要となります。