Partager via


Création de procédures stockées compilées en mode natif

Les procédures stockées compilées en mode natif n’implémentent pas la programmabilité complète Transact-SQL et la surface d’aire de requête. Certaines constructions Transact-SQL ne peuvent pas être utilisées à l’intérieur de procédures stockées compilées en mode natif. Pour plus d’informations, consultez Constructions prises en charge dans les procédures stockées compilées en mode natif.

Toutefois, il existe plusieurs fonctionnalités Transact-SQL prises en charge uniquement pour les procédures stockées compilées en mode natif :

  • Blocs atomiques. Pour plus d’informations, consultez Atomic Blocks.

  • NOT NULL contraintes sur les paramètres et les variables dans les procédures stockées compilées en mode natif. Vous ne pouvez pas affecter NULL de valeurs à des paramètres ou des variables déclarées en tant que NOT NULL. Pour plus d’informations, consultez DECLARE @local_variable (Transact-SQL).

  • Liaison de schéma de procédures stockées compilées en mode natif.

Les procédures stockées compilées en mode natif sont créées à l’aide de CREATE PROCEDURE (Transact-SQL). L’exemple suivant montre une table optimisée en mémoire et une procédure stockée compilée en mode natif utilisée pour insérer des lignes dans la table.

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  

Dans l’exemple de code, NATIVE_COMPILATION indique que cette procédure stockée Transact-SQL est une procédure stockée compilée en mode natif. Les options suivantes sont requises :

Choix Descriptif
SCHEMABINDING Les procédures stockées compilées en mode natif doivent être liées au schéma des objets qu’il référence. Cela signifie que les tableaux référencés par la procédure ne peuvent pas être supprimés. Les tables référencées dans la procédure doivent inclure leur nom de schéma et les caractères génériques (*) ne sont pas autorisés dans les requêtes. SCHEMABINDING est uniquement pris en charge pour les procédures stockées compilées en mode natif dans cette version de SQL Server.
EXECUTE AS Les procédures stockées compilées en mode natif ne prennent pas en charge EXECUTE AS CALLER, ce qui est le contexte d’exécution par défaut. Par conséquent, la spécification du contexte d’exécution est requise. Les options EXECUTE AS OWNER, EXECUTE ASl’utilisateur et EXECUTE AS SELF sont prises en charge.
BEGIN ATOMIC Le corps de la procédure stockée compilée en mode natif doit consister en un seul bloc atomique. Les blocs atomiques garantissent l’exécution atomique des procédures stockées. Si la procédure est appelée en dehors du contexte d'une transaction active, elle démarre une nouvelle transaction, qui se confirme à la fin du bloc atomique. Les blocs atomiques dans les procédures stockées compilées en mode natif ont deux options requises :

TRANSACTION ISOLATION LEVEL. Consultez les niveaux d’isolation des transactions pour connaître les niveaux d’isolation pris en charge.

LANGUAGE. La langue de la procédure stockée doit être définie sur l’une des langues ou alias de langue disponibles.

Concernant EXECUTE AS et les connexions Windows, une erreur peut se produire en raison de l’emprunt d’identité effectué via EXECUTE AS. Si un compte d’utilisateur utilise l’authentification Windows, il doit y avoir une confiance totale entre le compte de service utilisé pour l’instance SQL Server et le domaine de la connexion Windows. S’il n’existe pas de confiance totale, le message d’erreur suivant est retourné lors de la création d’une procédure stockée compilée en mode natif : Msg 15404, Impossible d’obtenir des informations sur le groupe/l’utilisateur Windows NT « username », le code d’erreur 0x5.

Pour résoudre cette erreur, utilisez l’une des options suivantes :

  • Utilisez un compte du même domaine que l’utilisateur Windows pour le service SQL Server.

  • Si SQL Server utilise un compte d’ordinateur tel que le service réseau ou le système local, l’ordinateur doit être approuvé par le domaine contenant l’utilisateur Windows.

  • Utilisez l’authentification SQL Server.

Vous pouvez également voir l’erreur 15517 lors de la création d’une procédure stockée compilée en mode natif. Pour plus d’informations, consultez MSSQLSERVER_15517.

Mise à jour d’une procédure stockée compilée en mode natif

L’exécution d’opérations de modification sur des procédures stockées compilées en mode natif n’est pas prise en charge. Une façon de modifier une procédure stockée compilée en mode natif consiste à supprimer et recréer la procédure stockée :

  1. Créez un script d'autorisations pour la procédure stockée.

  2. Facultatif, générez un script pour la procédure stockée et enregistrez en tant que sauvegarde.

  3. Supprimez la procédure stockée.

  4. Créez la procédure stockée modifiée.

  5. Réappliquez les autorisations scriptées à la procédure stockée.

L’inconvénient de cette procédure est que l’application sera hors connexion à partir du début de l’étape 3 jusqu’à la fin de l’étape 5. Cela peut prendre quelques secondes et le client utilisant l’application peut voir les messages d’erreur.

Une autre façon de modifier (efficacement) une procédure stockée compilée en mode natif consiste à créer d’abord une nouvelle version de la procédure stockée. Ici, la procédure stockée compilée en mode natif a un numéro de version associé. Nous appellerons l’ancienne version SP_Vold et la nouvelle version SP_Vnew.

  1. Générez un script pour les autorisations sur SP_Vold.

  2. Créez SP_Vnew.

  3. Appliquez les autorisations de SP_Vold à SP_Vnew.

  4. Mettez à jour les références à SP_Vold pour pointer vers SP_Vnew. Cela peut être effectué de différentes manières, par exemple :

    Utilisez une procédure stockée wrapper (basée sur disque) et modifiez cette procédure pour pointer vers SP_Vnew. L’inconvénient de cette approche est l’impact sur les performances de l’indirection.

    ALTER PROCEDURE dbo.SP p1,...,pn  
    AS  
      EXEC dbo.SP_Vnew p1,...,pn  
    GO  
    
  5. Facultatif, supprimez SP_Vold.

L’avantage de cette approche est que l’application n’est pas hors connexion. Toutefois, davantage de travail est nécessaire pour conserver les références et s’assurer qu’elles pointent toujours vers la dernière version de la procédure stockée.

Voir aussi

Procédures stockées compilées en mode natif