Erstellen systemintern kompilierter gespeicherter Prozeduren
Systemintern kompilierte gespeicherte Prozeduren implementieren nicht den vollständigen Transact-SQL-Programmierbarkeits- und Abfrageoberflächenbereich. Es gibt bestimmte Transact-SQL-Konstrukte, die nicht in systemintern 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:
ATOMIC-Blöcke. Weitere Informationen finden Sie unter ATOMIC-Blöcke.
NOT NULL
-Einschränkungen für Parameter von systemintern kompilierten gespeicherten Prozeduren und darin enthaltene Variablen. Sie können alsNULL
deklarierten Parametern oder Variablen keineNOT NULL
-Werte zuweisen. Weitere Informationen finden Sie unter DECLARE @local_variable (Transact-SQL).Schemabindung von systemintern kompilierten gespeicherten Prozeduren.
Systemintern kompilierte gespeicherte Prozeduren werden mit CREATE PROCEDURE (Transact-SQL) erstellt. Das folgende Beispiel zeigt eine speicheroptimierte Tabelle und eine systemintern 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
Gibt im Codebeispiel an, NATIVE_COMPILATION
dass es sich bei dieser gespeicherten Transact-SQL-Prozedur um eine systemintern kompilierte gespeicherte Prozedur handelt. Die folgenden Optionen sind erforderlich:
Option | BESCHREIBUNG |
---|---|
SCHEMABINDING |
Systemintern kompilierte gespeicherte Prozeduren müssen an das Schema der Objekte gebunden werden, auf die sie verweisen. Dies bedeutet, dass Tabellenverweise der Prozedur nicht gelöscht werden können. Die Tabellen, auf die in der Prozedur verwiesen wird, müssen den Schemanamen enthalten, und Platzhalterzeichen (*) sind in Abfragen nicht zulässig. SCHEMABINDING wird nur für systemintern kompilierte gespeicherte Prozeduren in dieser Version von SQL Server unterstützt. |
EXECUTE AS |
Systemintern kompilierte gespeicherte Prozeduren bieten keine Unterstützung für den standardmäßigen Ausführungskontext EXECUTE AS CALLER . Daher muss der Ausführungskontext angegeben werden. Die Optionen EXECUTE AS OWNER , EXECUTE AS Benutzer und EXECUTE AS SELF werden unterstützt. |
BEGIN ATOMIC |
Der Text einer systemintern kompilierten gespeicherten Prozedur muss genau ein ATOMIC-Block sein. ATOMIC-Blöcke gewährleisten die unteilbare Ausführung der gespeicherten Prozedur. Wenn die Prozedur außerhalb des Kontexts einer aktiven Transaktion aufgerufen wird, wird eine neue Transaktion gestartet, für die am Ende des ATOMIC-Blocks ein Commit ausgeführt wird. ATOMIC-Blöcke in systemintern kompilierten gespeicherten Prozeduren weisen zwei erforderliche Optionen auf:TRANSACTION ISOLATION LEVEL . Informationen zu unterstützten Isolationsstufen finden Sie unter Transaktionsisolationsstufen .LANGUAGE . Die Sprache der gespeicherten Prozedur muss auf eine der verfügbaren Sprachen bzw. einen der verfügbaren Sprachenaliase festgelegt werden. |
Bei EXECUTE AS
und Windows-Anmeldungen kann ein Fehler aufgrund des Identitätswechsels auftreten, der über EXECUTE AS
ausgeführt wird. Wenn ein Benutzerkonto die Windows-Authentifizierung verwendet, muss zwischen dem Dienstkonto, das für die SQL Server instance verwendet wird, und der Domäne der Windows-Anmeldung voll vertrauenswürdig sein. Wenn nicht voll vertrauenswürdig ist, wird beim Erstellen einer systemintern kompilierten gespeicherten Prozedur die folgende Fehlermeldung zurückgegeben: Msg 15404, Konnte keine Informationen zur Windows NT-Gruppe bzw. zum Benutzer "Benutzername" erhalten, Fehlercode 0x5.
Verwenden Sie einen der folgenden Schritte, um diesen Fehler zu beheben:
Verwenden Sie für den SQL Server-Dienst ein Konto, das aus derselben Domäne wie der Windows-Benutzer stammt.
Wenn SQL Server ein Computerkonto wie Netzwerkdienst oder lokales System verwendet, muss der Computer von der Domäne vertrauenswürdig sein, die den Windows-Benutzer enthält.
Verwenden Sie SQL Server-Authentifizierung.
Möglicherweise wird auch Fehler 15517 angezeigt, wenn Sie eine systemintern kompilierte gespeicherte Prozedur erstellen. Weitere Informationen finden Sie unter MSSQLSERVER_15517.
Aktualisieren einer systemintern kompilierten gespeicherten Prozedur
Das Ausführen von Änderungsvorgängen für systemintern kompilierte gespeicherte Prozeduren wird nicht unterstützt. Eine Möglichkeit, eine systemintern kompilierte gespeicherte Prozedur zu ändern, ist das Löschen und erneute Erstellen der gespeicherten Prozedur:
Generieren Sie ein Skript mit Berechtigungen für die gespeicherte Prozedur.
Generieren Sie optional ein Skript für die gespeicherte Prozedur, und speichern Sie es als Sicherung.
Löschen Sie die gespeicherte Prozedur.
Erstellen Sie die geänderte gespeicherte Prozedur.
Wenden Sie das Skript mit den Berechtigungen erneut auf die gespeicherte Prozedur an.
Der Nachteil bei dieser Vorgehensweise besteht darin, dass die Anwendung vom Beginn von Schritt 3 bis zum Abschluss von Schritt 5 offline ist. Dies kann mehrere Sekunden dauern, und der Client, der die Anwendung verwendet, erhält in dieser Zeit möglicherweise Fehlermeldungen.
Eine andere (effektive) Möglichkeit zum Ändern einer systemintern kompilierten gespeicherten Prozedur besteht darin, zuerst eine neue Version der gespeicherten Prozedur zu erstellen. In diesem Fall erhält die systemintern kompilierte gespeicherte Prozedur eine zugehörige Versionsnummer. Die alte Version erhält die Bezeichnung SP_Vold und die neue Version die Bezeichnung SP_Vnew.
Generieren Sie ein Skript mit den Berechtigungen für SP_Vold.
Erstellen Sie SP_Vnew.
Wenden Sie die Berechtigungen von SP_Vold auf SP_Vnew an.
Aktualisieren Sie die Verweise auf SP_Vold, sodass sie auf SP_Vnew zeigen. Hierbei haben Sie verschiedene Möglichkeiten:
Verwenden Sie eine gespeicherte Wrapperprozedur (datenträgerbasiert), und ändern Sie diese Prozedur, sodass sie auf SP_Vnew zeigt. Der Nachteil bei dieser Vorgehensweise sind die Leistungsverluste durch die Dereferenzierung.
ALTER PROCEDURE dbo.SP p1,...,pn AS EXEC dbo.SP_Vnew p1,...,pn GO
Löschen Sie optional SP_Vold.
Der Vorteil dieser Vorgehensweise besteht darin, dass die Anwendung nicht offline geschaltet wird. Allerdings sind mehr Schritte erforderlich, um die Verweise beizubehalten und sicherzustellen, dass sie immer auf die neueste Version der gespeicherten Prozedur zeigen.