Steuern der Triggerausführung beim Massenimport von Daten
Ein Trigger ist ein besonderer Typ einer gespeicherten Prozedur, der automatisch ausgeführt wird, wenn ein Benutzer Daten in einer Tabelle oder Sicht ändert. Das Ausführen von Triggern kann die Leistung eines Massenimportvorgangs beeinträchtigen. Wenn z. B. ein Trigger jedesmal eine E-Mail-Nachricht sendet, wenn ein Datensatz importiert wird, wird die Geschwindigkeit eines Massenimportvorgangs reduziert und ein Durcheinander von E-Mails erzeugt.
Beim Massenimport von Daten können Sie mit dem Massenimportvorgang steuern, ob Trigger ausgeführt (bzw. ausgelöst) werden. Trigger sollten von einem Massenimportvorgang nur für eine Tabelle ausgeführt werden, deren INSERT- und INSTEAD OF-Trigger das Einfügen mehrerer Zeilen unterstützen. Weitere Informationen zu diesen Triggern finden Sie unter DML-Trigger.
Wichtig |
---|
Wenn Trigger deaktiviert sind, können mit einer Schemaänderungssperre die Metadaten aktualisiert werden. Dadurch können andere Befehle (z. B. eine Onlineindexerstellung) oder Transaktionen beeinträchtigt werden. Beispielsweise kann bei einer Snapshot-Isolationstransaktion, die auf die Zieltabelle zugreift, ein Fehler aufgrund gleichzeitiger DDL-Änderungen auftreten. |
Falls Trigger aktiviert sind, werden sie pro Batch einmal ausgeführt.
Während eines Massenimportvorgangs hängt das Verhalten von dem für den Vorgang verwendeten Befehl ab. Standardmäßig werden Trigger vom bcp-Befehl und von der BULK INSERT-Anweisung (Transact-SQL) deaktiviert. Im Gegensatz dazu werden bei INSERT ... SELECT * FROM OPENROWSET(BULK...)-Anweisung standardmäßig Trigger ausgeführt.
In der folgenden Tabelle wird das Standardverhalten zusammengefasst.
Massenimportbefehl |
Standardverhalten |
---|---|
bcp |
Trigger deaktivieren |
BULK INSERT |
Trigger deaktivieren |
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
Trigger ausführen |
Jeder Massenimportbefehl stellt einen Qualifizierer bereit, mit dem Sie wie in den folgenden Abschnitten beschrieben festlegen können, wie Trigger behandelt werden.
Ausführen von Triggern mit bcp oder BULK INSERT
Standardmäßig werden Trigger vom bcp-Befehl und von der BULK INSERT-Anweisung nicht ausgeführt. Sie können jedoch Trigger mithilfe der folgenden Qualifizierer aktivieren:
Befehl |
Qualifizierer |
Qualifizierertyp |
---|---|---|
bcp |
-h"FIRE_TRIGGERS" |
Hinweis |
BULK INSERT |
FIRE_TRIGGERS |
Argument |
Falls FIRE_TRIGGERS für einen Massenimportvorgang angegeben ist, werden alle für die Tabelle definierten INSERT- und INSTEAD OF-Trigger für alle in die Tabelle eingefügten Zeilen ausgeführt.
Weitere Informationen finden Sie unter bcp (Dienstprogramm) und BULK INSERT (Transact-SQL).
Deaktivieren von Triggern in INSERT ... SELECT * FROM OPENROWSET(BULK...)
Standardmäßig werden Trigger vom OPENROWSET BULK-Rowsetanbieter ausgeführt. Sie können Trigger mithilfe des folgenden Qualifizierers deaktivieren:
Befehl |
Qualifizierer |
Qualifizierertyp |
---|---|---|
INSERT ... SELECT * FROM OPENROWSET(BULK...) |
WITH(IGNORE_TRIGGERS) |
Tabellenhinweis |
Wenn dieser Hinweis angegeben ist, werden Trigger vom OPENROWSET BULK-Rowsetanbieter nicht ausgeführt. Weitere Informationen zum IGNORE_TRIGGERS-Hinweis finden Sie unter Tabellenhinweise (Transact-SQL).
Importieren großer Batches mit aktivierten Triggern
SQL Server 2005 und höhere Versionen verwenden für Trigger die Zeilenversionsverwaltung und speichern die Zeilenversionen im Versionsspeicher in tempdb. Bevor Sie einen Massenimport eines großen Batches von Datensätzen, die Trigger verwenden, durchführen können, müssen Sie gegebenenfalls die Größe von tempdb erweitern, um der Auswirkung der Trigger auf den Versionsspeicher gerecht zu werden. Weitere Informationen finden Sie unter Ressourcenverwendung bei der Zeilenversionsverwaltung.