Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL Managed Instance
Wenn Sie über eine oder mehrere gespeicherte Prozeduren verfügen, die beim Verleger ausgeführt werden und sich auf veröffentlichte Tabellen auswirken, sollten Sie in Erwägung ziehen, diese gespeicherten Prozeduren als Artikel zur Ausführung gespeicherter Prozeduren in Ihre Veröffentlichung aufzunehmen. Die Definition der Prozedur (die CREATE PROCEDURE-Anweisung) wird bei der Initialisierung des Abonnements an den Abonnenten repliziert; wenn die Prozedur beim Publisher ausgeführt wird, führt die Replikation die entsprechende Prozedur beim Abonnenten aus. Dies kann in den Fällen, in denen umfangreiche Batchvorgänge ausgeführt werden, zu einer deutlichen Leistungssteigerung führen, da nur die Ausführung der Prozedur repliziert wird und sich das Replizieren der einzelnen Änderungen für jede Zeile erübrigt. Nehmen wir z. B. an, Sie erstellen in der Veröffentlichungsdatenbank die folgende gespeicherte Prozedur:
CREATE PROC give_raise AS
UPDATE EMPLOYEES SET salary = salary * 1.10
Mit dieser Prozedur erhält jeder der 10.000 Angestellten in Ihrem Unternehmen eine Gehaltserhöhung von 10 %. Wenn Sie diese gespeicherte Prozedur auf dem Verleger ausführen, aktualisiert sie die Gehälter aller Angestellten. Ohne die Replikation der Ausführung der gespeicherten Prozedur würde das Update an die Abonnenten als eine große Transaktion mit mehreren Schritten gesendet:
BEGIN TRAN
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 1'
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 2'
Dieser Vorgang würde sich dann für 10.000 Updates wiederholen.
Bei der Replikation der Ausführung gespeicherter Prozeduren wird nur der Befehl zum Ausführen der gespeicherten Prozedur beim Abonnenten gesendet, anstatt alle Aktualisierungen in die Verteilungsdatenbank zu schreiben und sie anschließend über das Netzwerk an den Abonnenten zu senden:
EXEC give_raise
Wichtig
Die Replikation von gespeicherten Prozeduren eignet sich nicht für alle Anwendungen. Wenn ein Artikel horizontal gefiltert wird, sodass beim Verleger andere Zeilensätze vorhanden sind als beim Abonnenten, liefert die Ausführung derselben gespeicherten Prozedur an beiden Orten unterschiedliche Ergebnisse. Ebenso führt die Ausführung derselben gespeicherten Prozedur sowohl beim Verleger als auch beim Abonnenten zu unterschiedlichen Ergebnissen, wenn ein Update auf einer Unterabfrage einer anderen, nicht replizierten Tabelle basiert.
So veröffentlichen Sie die Ausführung einer gespeicherten Prozedur
SQL Server Management Studio: Veröffentlichen der Ausführung einer gespeicherten Prozedur in einer Transaktionsveröffentlichung (SQL Server Management Studio)
Replikationsprogrammierung mit Transact-SQL: Führen Sie sp_addarticle (Transact-SQL) aus, und geben Sie dabei für den Parameter
@typedie Werte „serializable proc exec“ (empfohlen) oder „proc exec“ an. Weitere Informationen zum Definieren von Artikeln finden Sie unter Definieren eines Artikels.
Ändern des Verfahrens beim Teilnehmer
Standardmäßig wird die Definition der gespeicherten Prozedur beim Publisher an jeden Subscriber weitergeleitet. Sie können jedoch auch die gespeicherte Prozedur auf dem Abonnenten ändern. Dies ist dann sinnvoll, wenn auf dem Verleger und dem Abonnenten eine unterschiedliche Logik ausgeführt werden soll. Gehen wir als Beispiel von sp_big_deleteaus, einer gespeicherten Prozedur auf dem Verleger mit zwei Funktionen: Zum einen löscht die Prozedur 1.000.000 Zeilen aus der replizierten big_table1 -Tabelle, zum anderen aktualisiert sie die nicht replizierte big_table2-Tabelle. Um den Bedarf an Netzwerkressourcen zu reduzieren, sollten Sie das Löschen der 1 Million Zeilen als gespeicherte Prozedur weitergeben, indem Sie sp_big_deleteveröffentlichen. Beim Abonnenten können Sie sp_big_delete so ändern, dass nur die 1 Million Zeilen gelöscht werden und keine anschließende Aktualisierung von big_table2 ausgeführt wird.
Hinweis
Standardmäßig werden alle Änderungen, die beim Publisher mit ALTER PROCEDURE vorgenommen werden, an den Subscriber weitergegeben. Um dies zu verhindern, deaktivieren Sie die Verteilung von Schemaänderungen vor der Ausführung ALTER PROCEDURE. Weitere Informationen zu Schemaänderungen finden Sie unter Vornehmen von Schemaänderungen in Veröffentlichungsdatenbanken.
Typen von Artikeln für die Ausführung einer gespeicherter Prozedur
Es gibt zwei verschiedene Möglichkeiten, mit denen die Ausführung einer gespeicherten Prozedur veröffentlicht werden kann: serialisierbare Prozedurausführungsartikel und Prozedurausführungsartikel.
Die Verwendung der ersten Option wird empfohlen, weil dabei die Prozedurausführung nur dann repliziert wird, wenn die Prozedur im Kontext einer serialisierbaren Transaktion ausgeführt wird. Falls die gespeicherte Prozedur von außerhalb einer serialisierbaren Transaktion ausgeführt wird, werden Änderungen an den Daten in den veröffentlichten Tabellen als eine Reihe von DML-Anweisungen repliziert. Dieses Verhalten trägt dazu bei, dass die Daten auf dem Abonnenten mit den Daten auf dem Verleger konsistent sind. Dies erweist sich vor allem für Batchvorgänge, wie z. B. umfangreiche Cleanupvorgänge, als hilfreich.
Bei der Option zum Ausführen von Prozeduren kann die Prozedurausführung auf alle Abonnenten repliziert werden, und zwar unabhängig davon, ob die einzelnen Anweisungen in der gespeicherten Prozedur erfolgreich waren. Da Änderungen, die von der gespeicherten Prozedur an den Daten vorgenommen wurden, innerhalb mehrerer Transaktionen auftreten können, ist außerdem nicht sichergestellt, dass die Daten auf den Abonnenten mit den Daten auf dem Verleger konsistent sind. Zur Behebung dieser Probleme ist es erforderlich, dass Abonnements schreibgeschützt sind und dass Sie eine Isolationsstufe oberhalb von READ UNCOMMITTED verwenden. Wenn Sie READ UNCOMMITTED verwendet, werden Änderungen an Daten in veröffentlichten Tabellen als Reihe von DML-Anweisungen repliziert.
Im folgenden Beispiel werden die Gründe veranschaulicht, warum das Replizieren von Prozeduren als serialisierbare Prozedurartikel empfehlenswert ist.
BEGIN TRANSACTION T1
SELECT @var = max(col1) FROM tableA
UPDATE tableA SET col2 = <value>
WHERE col1 = @var
BEGIN TRANSACTION T2
INSERT tableA VALUES <values>
COMMIT TRANSACTION T2
Im vorherigen Beispiel wird davon ausgegangen, dass die SELECT-Anweisung in Transaktion T1 vor dem INSERT in Transaktion T2 stattfindet.
Wird die Prozedur nicht in einer serialisierbaren Transaktion ausgeführt (beispielsweise mit einer auf SERIALIZABLE festgelegten Isolationsstufe), kann die T2-Transaktion innerhalb des Bereichs der SELECT-Anweisung in T1 eine neue Zeile einfügen und vor T1 ein Commit ausführen. Das bedeutet auch, dass sie vor T1 auf den Abonnenten angewendet wird. Wenn T1 beim Abonnenten angewendet wird, kann SELECT möglicherweise einen anderen Wert als beim Publisher zurückgeben und zu einem anderen Ergebnis als dem von UPDATE führen.
Wenn die Prozedur innerhalb einer serialisierbaren Transaktion ausgeführt wird, darf Transaktion T2 nicht innerhalb des von der SELECT-Anweisung in T2 abgedeckten Bereichs einfügen. Sie wird dann so lange blockiert, bis T1 einen Commit ausführt und so dieselben Ergebnisse auf dem Abonnenten sichergestellt sind.
Sperren werden länger aufrechterhalten, wenn Sie die Prozedur innerhalb einer serialisierbaren Transaktion ausführen, und können zu geringerer Parallelität führen.
Die XACT_ABORT Einstellung
Bei der Replikation der Ausführung gespeicherter Prozeduren sollte die Einstellung für die Sitzung, die die gespeicherte Prozedur ausführt, auf XACT_ABORT ON festgelegt sein. Wenn XACT_ABORT auf "AUS" festgelegt ist und während der Ausführung der Prozedur beim Publisher ein Fehler auftritt, tritt derselbe Fehler beim Subscriber auf, wodurch der Verteilungs-Agent fehlschlägt. Das Angeben von XACT_ABORT EIN stellt sicher, dass alle Fehler, die während der Ausführung beim Publisher auftreten, dazu führen, dass die gesamte Ausführung zurückgerollt wird, wodurch ein Fehler des Verteilungs-Agents vermieden wird. Weitere Informationen zur Einstellung XACT_ABORTfinden Sie unter SET XACT_ABORT (Transact-SQL).
Wenn Sie eine Einstellung von XACT_ABORT OFF benötigen, geben Sie den Parameter "-SkipErrors" für die Verteilungs-Agent an. Auf diese Weise kann der Agent auch dann die Änderungen auf den Abonnenten anwenden, wenn es zu einem Fehler kommt.