Creazione di stored procedure compilate in modo nativo
Le stored procedure compilate in modo nativo non implementano la programmabilità Transact-SQL completa e l'area di superficie di query. Esistono alcuni costrutti Transact-SQL che non possono essere usati all'interno di stored procedure compilate in modo nativo. Per altre informazioni, vedere Costrutti supportati nelle stored procedure compilate in modo nativo.
Esistono tuttavia diverse funzionalità Transact-SQL supportate solo per le stored procedure compilate in modo nativo:
Blocchi atomici. Per altre informazioni, vedere Atomic Blocks.
Vincoli
NOT NULL
su parametri e variabili nelle stored procedure compilate in modo nativo. Non è possibile assegnare valoriNULL
ai parametri o alle variabili dichiarate comeNOT NULL
. Per altre informazioni, vedere DECLARE @local_variable (Transact-SQL).Associazione allo schema delle stored procedure compilate in modo nativo.
Le stored procedure compilate in modo nativo vengono create usando CREATE PROCEDURE (Transact-SQL). Nell'esempio seguente vengono illustrate una tabella ottimizzata per la memoria e una stored procedure compilata in modo nativo per inserire righe nella tabella.
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
Nell'esempio di codice indica NATIVE_COMPILATION
che questa stored procedure Transact-SQL è una stored procedure compilata in modo nativo. Sono necessarie le opzioni seguenti:
Opzione | Descrizione |
---|---|
SCHEMABINDING |
Le stored procedure compilate in modo nativo devono essere associate allo schema degli oggetti a cui fa riferimento. Ciò significa che i riferimenti alla tabella della procedura non possono essere eliminati. Le tabelle a cui viene fatto riferimento nella procedura devono includere il nome dello schema e i caratteri jolly (*) non sono consentiti nelle query. SCHEMABINDING è supportato solo per stored procedure compilate in modo nativo in questa versione di SQL Server. |
EXECUTE AS |
Le stored procedure compilate in modo nativo non supportano EXECUTE AS CALLER , ovvero il contesto di esecuzione predefinito. Di conseguenza, è necessario specificare il contesto di esecuzione. Le opzioni EXECUTE AS OWNER , EXECUTE AS l'utente e EXECUTE AS SELF sono supportate. |
BEGIN ATOMIC |
Il corpo di una stored procedure compilata in modo nativo deve essere costituito esattamente da un blocco atomico. I blocchi atomici garantiscono l'esecuzione atomica della stored procedure. Se la stored procedure viene richiamata all'esterno del contesto di una transazione attiva, verrà avviata una nuova transazione il cui commit avverrà alla fine del blocco atomico. I blocchi atomici nelle stored procedure compilate in modo nativo presentano due opzioni obbligatorie:TRANSACTION ISOLATION LEVEL . Per i livelli di isolamento supportati, vedere Livelli di isolamento delle transazioni .LANGUAGE . Il linguaggio della stored procedure deve essere impostato su uno dei linguaggi o alias disponibili. |
In relazione a EXECUTE AS
e agli account di accesso di Windows, può verificarsi un errore a causa della rappresentazione eseguita tramite EXECUTE AS
. Se un account utente usa l'autenticazione di Windows, deve essere presente un trust completo tra l'account del servizio usato per l'istanza di SQL Server e il dominio dell'account di accesso di Windows. Se non è presente attendibilità completa, viene restituito il seguente messaggio di errore durante la creazione di una stored procedure compilata in modo nativo: Msg 15404, Impossibile ottenere informazioni sul gruppo/utente di Windows NT 'username', il codice di errore 0x5.
Per risolvere l'errore, utilizzare una delle soluzioni seguenti:
Usare un account dallo stesso dominio dell'utente Windows per il servizio di SQL Server.
Se SQL Server usa un account del computer, ad esempio servizio di rete o sistema locale, il computer deve essere attendibile dal dominio contenente l'utente di Windows.
Usare SQL Server autenticazione.
Durante la creazione di una stored procedure compilata in modo nativo, potrebbe essere visualizzato l'errore 15517. Per altre informazioni, vedere MSSQLSERVER_15517.
Aggiornamento di una stored procedure compilata in modo nativo
L'esecuzione di operazioni di modifica nelle stored procedure compilate in modo nativo non è supportata. Per modificare una stored procedure compilata in modo nativo è possibile eliminare e ricreare la stored procedure:
Generare lo script per le autorizzazioni della stored procedure.
Facoltativamente, generare lo script per la stored procedure e il salvataggio come backup.
Eliminare la stored procedure.
Creare la stored procedure modificata.
Riapplicare le autorizzazioni dello script alla stored procedure.
Lo svantaggio di questa procedura consiste nel fatto che l'applicazione sarà offline dall'inizio del passaggio 3 alla fine del passaggio 5. È possibile che siano necessari alcuni secondi e che il client che utilizza l'applicazione riceva messaggi di errore.
Un'altra soluzione efficace per modificare una stored procedure compilata in modo nativo consiste nel creare innanzitutto una nuova versione della stored procedure. In questo caso, la stored procedure compilata in modo nativo ha un numero di versione associato. La versione precedente si chiama SP_Vold e la nuova versione SP_Vnew.
Generare lo script per le autorizzazioni di SP_Vold.
Creare SP_Vnew.
Applicare le autorizzazioni di SP_Vold a SP_Vnew.
Aggiornare i riferimenti a SP_Vold in modo che puntino a SP_Vnew. Questa operazione può essere eseguita in diversi modi, ad esempio:
Utilizzare una stored procedure (basata su disco) wrapper e modificare tale procedura in modo che punti a SP_Vnew. Lo svantaggio di questo approccio sta nell'impatto del riferimento indiretto sulle prestazioni.
ALTER PROCEDURE dbo.SP p1,...,pn AS EXEC dbo.SP_Vnew p1,...,pn GO
Facoltativamente, eliminare SP_Vold.
Il vantaggio di questo approccio consiste nel fatto che l'applicazione non risulta offline. Tuttavia, è necessario più impegno per mantenere i riferimenti e verificare che puntino sempre alla versione più recente della stored procedure.