Share 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é et la zone de requête Transact-SQL complètes. Certaines constructions Transact-SQL ne peuvent pas être utilisées dans des 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, plusieurs fonctionnalités Transact-SQL sont prises en charge uniquement pour les procédures stockées compilées en mode natif :

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

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

  • Liaison de schéma des 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 illustre 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 :

Option Description
SCHEMABINDING Les procédures stockées compilées en mode natif doivent être liées au schéma des objets qu’elles référencent. Cela signifie que la table référencée par la procédure ne peut pas être supprimée. Les tables référencées dans la procédure doivent inclure le nom du schéma, et les caractères génériques (*) ne sont pas autorisés dans les requêtes. SCHEMABINDINGest 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, qui est le contexte d'exécution par défaut. Par conséquent, vous devez spécifier le contexte d'exécution. Les options EXECUTE AS OWNER, EXECUTE ASuser et EXECUTE AS SELF sont prises en charge.
BEGIN ATOMIC Le corps d'une procédure stockée compilée en mode natif doit être un bloc Atomic. Les blocs Atomic garantissent l'exécution atomique de la procédure stockée. Si la procédure est appelée en dehors du contexte d'une transaction active, elle démarre une nouvelle transaction, qui valide la transaction à la fin du bloc Atomic. Deux options sont obligatoires pour les blocs Atomic dans les procédures stockées compilées en mode natif :

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

LANGUAGE. Le langage de la procédure stockée doit être défini sur l'un des langages ou des alias de langage disponibles.

En ce qui concerne 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 le SQL Server instance et le domaine de la connexion Windows. S’il n’y a 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 « nom d’utilisateur », 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 Service réseau ou Système local, l’ordinateur doit être approuvé par le domaine contenant l’utilisateur Windows.

  • Utilisez l’authentification SQL Server.

L'erreur 15517 s'affiche également lorsque vous créez 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 (ALTER) sur les procédures stockées compilées en mode natif n'est pas prise en charge. Une méthode pour modifier une procédure stockée compilée en mode natif consiste à supprimer et recréer la procédure stockée :

  1. Générez un script d'autorisations sur la procédure stockée.

  2. Éventuellement, générez un script pour la procédure stockée et enregistrez-le comme sauvegarde.

  3. Supprimez la procédure stockée.

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

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

L’inconvénient de cette procédure est que l’application sera hors connexion du début de l’étape 3 jusqu’à la fin de l’étape 5. Cette opération peut prendre quelques secondes et le client qui utilise l'application peut recevoir des messages d'erreur.

Une autre méthode pour modifier (efficacement) une procédure stockée compilée en mode natif consiste à créer, dans un premier temps, une nouvelle version de la procédure stockée. La procédure stockée compilée en mode natif possède un numéro de version associé. Nous allons nommer l'ancienne version SP_Vold et la nouvelle SP_Vnew.

  1. Générez un script d'autorisations sur SP_Vold

  2. Créez SP_Vnew.

  3. Appliquez les autorisations de SP_Vold à SP_new.

  4. Mettez à jour les références à SP_Vold de façon à ce qu'elles pointent vers SP_Vnew. Cette opération peut être effectuée de différentes manières, par exemple :

    Utilisez une procédure stockée (sur disque) de wrapper, et modifiez-la de façon à ce qu'elle pointe vers SP_Vnew. L'inconvénient de cette méthode est l'impact de l'indirection sur les performances.

    ALTER PROCEDURE dbo.SP p1,...,pn  
    AS  
      EXEC dbo.SP_Vnew p1,...,pn  
    GO  
    
  5. Supprimez éventuellement SP_Vold.

L'avantage de cette méthode est que l'application n'est pas mise hors connexion. En revanche, cette méthode nécessite davantage de travail pour gérer les références et veiller à ce qu'elles pointent toujours vers la version la plus récente de la procédure stockée.

Voir aussi

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