Freigeben über


Erstellen von nativ kompilierten gespeicherten Prozeduren

Nativ kompilierte gespeicherte Prozeduren implementieren nicht den vollständigen Transact-SQL Programmierbarkeit und Abfrageoberflächenbereich. Es gibt bestimmte Transact-SQL Konstrukte, die nicht in systemeigenen kompilierten gespeicherten Prozeduren verwendet werden können. Weitere Informationen finden Sie unter "Unterstützte Konstrukte" in nativ kompilierten gespeicherten Prozeduren.

Es gibt jedoch mehrere Transact-SQL Features, die nur für nativ kompilierte gespeicherte Prozeduren unterstützt werden:

  • Atomblöcke. Weitere Informationen finden Sie unter Atomblöcke.

  • NOT NULL Einschränkungen für Parameter und Variablen in nativ kompilierten gespeicherten Prozeduren. Sie können Parametern oder Variablen, die als NOT NULLdeklariert werden, keine Werte zuweisenNULL. Weitere Informationen finden Sie unter DECLARE @local_variable (Transact-SQL).

  • Schemabindung von nativ kompilierten gespeicherten Prozeduren.

Nativ kompilierte gespeicherte Prozeduren werden mithilfe von CREATE PROCEDURE (Transact-SQL) erstellt. Das folgende Beispiel zeigt eine speicheroptimierte Tabelle und eine nativ kompilierte gespeicherte Prozedur, die zum Einfügen von Zeilen in die Tabelle verwendet wird.

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  

Im Codebeispiel wird durch NATIVE_COMPILATION angezeigt, dass diese Transact-SQL gespeicherte Prozedur eine nativ kompilierte gespeicherte Prozedur ist. Die folgenden Optionen sind erforderlich:

Auswahlmöglichkeit BESCHREIBUNG
SCHEMABINDING Nativ kompilierte gespeicherte Prozeduren müssen an das Schema der Objekte gebunden werden, auf die verwiesen wird. Dies bedeutet, dass Tabellenverweise durch die Prozedur nicht gelöscht werden können. Tabellen, auf die in der Prozedur verwiesen wird, müssen ihren Schemanamen enthalten, und Platzhalter (*) sind in Abfragen nicht zulässig. SCHEMABINDING wird nur für nativ kompilierte gespeicherte Prozeduren in dieser Version von SQL Server unterstützt.
EXECUTE AS Nativ kompilierte gespeicherte Prozeduren unterstützen EXECUTE AS CALLER nicht, was den Standardausführungskontext darstellt. Daher ist die Angabe des Ausführungskontexts erforderlich. Die Optionen EXECUTE AS OWNER, EXECUTE ASbenutzer und EXECUTE AS SELF werden unterstützt.
BEGIN ATOMIC Der nativ kompilierte gespeicherte Prozedurtext muss aus genau einem Atomblock bestehen. Atomblöcke garantieren die atome Ausführung der gespeicherten Prozedur. Wenn die Prozedur außerhalb des Kontexts einer aktiven Transaktion aufgerufen wird, wird eine neue Transaktion gestartet, die am Ende des Atomblocks bestätigt wird. Atomblöcke in nativ kompilierten gespeicherten Prozeduren haben zwei erforderliche Optionen:

TRANSACTION ISOLATION LEVEL. Siehe Transaktionsisolationsstufen für unterstützte Isolationsstufen.

LANGUAGE. Die Sprache für die gespeicherte Prozedur muss auf eine der verfügbaren Sprachen oder Sprachaliasen festgelegt werden.

Bezüglich EXECUTE AS und Windows-Anmeldungen kann ein Fehler aufgrund der durch EXECUTE AS erfolgenden Imitation auftreten. Wenn ein Benutzerkonto die Windows-Authentifizierung verwendet, muss zwischen dem Dienstkonto, das für die SQL Server-Instanz verwendet wird, und der Domäne der Windows-Anmeldung eine volle Vertrauensstellung bestehen. Wenn keine vollständige Vertrauenswürdigkeit vorliegt, wird die folgende Fehlermeldung beim Erstellen einer systemeigenen kompilierten gespeicherten Prozedur zurückgegeben: Msg 15404, Informationen zur Windows NT-Gruppe/des Benutzers "Benutzername" konnten nicht abgerufen werden, Fehlercode 0x5.

Verwenden Sie eine der folgenden Optionen, um diesen Fehler zu beheben:

  • Verwenden Sie ein Konto aus derselben Domäne wie der Windows-Benutzer für den SQL Server-Dienst.

  • Wenn SQL Server ein Computerkonto wie Netzwerkdienst oder lokales System verwendet, muss der Computer von der Domäne, die den Windows-Benutzer enthält, als vertrauenswürdig eingestuft werden.

  • Verwenden Sie die SQL Server-Authentifizierung.

Möglicherweise wird auch Fehler 15517 beim Erstellen einer nativ kompilierten gespeicherten Prozedur angezeigt. Weitere Informationen finden Sie unter MSSQLSERVER_15517.

Aktualisieren einer nativ kompilierten gespeicherten Prozedur

Das Ausführen von Änderungsvorgängen für nativ kompilierte gespeicherte Prozeduren wird nicht unterstützt. Eine Möglichkeit zum Ändern einer nativ kompilierten gespeicherten Prozedur besteht darin, die gespeicherte Prozedur abzulegen und neu zu erstellen:

  1. Generieren Sie ein Skript für die Berechtigungen für die gespeicherte Prozedur.

  2. Optional, generieren Sie ein Skript für die gespeicherte Prozedur, und speichern Sie als Sicherung.

  3. Legen Sie die gespeicherte Prozedur ab.

  4. Erstellen Sie die geänderte gespeicherte Prozedur.

  5. Wenden Sie die Skriptberechtigungen erneut auf die gespeicherte Prozedur an.

Der Nachteil dieses Verfahrens besteht darin, dass die Anwendung ab Schritt 3 bis zum Abschluss von Schritt 5 offline ist. Dies kann einige Sekunden dauern, und der Client, der die Anwendung verwendet, kann Fehlermeldungen sehen.

Eine weitere Möglichkeit zum (effektiven) Ändern einer nativ kompilierten gespeicherten Prozedur besteht darin, zuerst eine neue Version der gespeicherten Prozedur zu erstellen. Hier weist die nativ kompilierte gespeicherte Prozedur eine zugeordnete Versionsnummer auf. Wir nennen die alte Version SP_Vold und die neue Version SP_Vnew.

  1. Generieren Sie ein Skript für die Berechtigungen für SP_Vold.

  2. Erstellen Sie SP_Vnew.

  3. Wenden Sie die Berechtigungen von SP_Vold auf SP_Vnew an.

  4. Aktualisieren Sie Verweise auf SP_Vold, um auf SP_Vnew zu verweisen. Dies kann auf unterschiedliche Weise erreicht werden, z. B.:

    Verwenden Sie eine datenträgerbasierte gespeicherte Prozedur als Wrapper und ändern Sie diese Prozedur so, dass sie auf SP_Vnew verweist. Der Nachteil dieses Ansatzes ist der Leistungseinbruch durch die Indirektion.

    ALTER PROCEDURE dbo.SP p1,...,pn  
    AS  
      EXEC dbo.SP_Vnew p1,...,pn  
    GO  
    
  5. Optional, entferne SP_Vold.

Der Vorteil dieses Ansatzes besteht darin, dass die Anwendung nicht offline ist. Es ist jedoch mehr Arbeit erforderlich, um die Verweise beizubehalten und sicherzustellen, dass sie immer auf die neueste Version der gespeicherten Prozedur verweisen.

Siehe auch

Nativ kompilierte gespeicherte Prozeduren