Um Ihr Problem zu lösen, müssen wir programmatisch vorgehen. Es gibt zwei Routen, die Sie hier gehen können. Der Grund für die Notwendigkeit dieser Ansätze besteht darin, dass Sie einen Trigger für eine bestimmte Anweisung nicht deaktivieren können. Er kann nur für die gesamte Tabelle deaktiviert werden.
Option 1: Context_Info ()
Samuel Vanga bei MS SQL Tips hatte ein großartiges Beispiel:
USE AdventureWorks;
GO
-- creating the table in AdventureWorks database
IF OBJECT_ID('dbo.Table1') IS NOT NULL
DROP TABLE dbo.Table1
GO
CREATE TABLE dbo.Table1(ID INT)
GO
-- Creating a trigger
CREATE TRIGGER TR_Test ON dbo.Table1 FOR INSERT,UPDATE,DELETE
AS
DECLARE @Cinfo VARBINARY(128)
SELECT @Cinfo = Context_Info()
IF @Cinfo = 0x55555
RETURN
PRINT 'Trigger Executed'
-- Actual code goes here
-- For simplicity, I did not include any code
GO
Wenn Samuel nicht möchte, dass der Trigger ausgeführt wird, verwenden sie Folgendes:
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
verwendet die folgenden Systemansichten, um Informationen zur aktuellen Sitzung abzurufen:
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
Die Ideologie hier ist, dass die von Ihnen festgelegte Binärzeichenfolge nur für die aktuelle Sitzung verfügbar ist. Wenn der Trigger also während Ihrer Sitzung ausgeführt wird, wird der Gültigkeitsbereich und die variable Einstellung der Context_info
Funktion angezeigt und es wird zum Escape-Teil des Triggers gesprungen stattdessen.
Option 2: Temp-Tabelle
Itzik Ben-Gan hat eine großartige Lösung in seinem Buch "Innerhalb von Microsoft SQL Server 2008 T-SQL-Programmierung: T-SQL-Programmierung", das sich auch in seinem späteren Buch T-SQL-Abfragen befindet . Das Hauptproblem bei dieser context_info
Funktion ist der geringe TempDB-Overhead.
Um die Überraschung zu verderben, aber die Handlung der Bücher nicht zu ruinieren (ich hatte das Gefühl, dass es sich lohnt, sie zu kaufen und zu lesen), werden Sie Ihren Auslöser ändern.
Ihr Trigger sollte eine Prüfung für eine temporäre Tabelle durchführen. Wenn die temporäre Tabelle vorhanden ist, sollte der Trigger wissen, dass er die Aktionen beendet und nicht ausführt.
Erstellen Sie in der Update-Anweisung, die Sie ausführen möchten, zuerst die temporäre Tabelle. Es wird in derselben Transaktion wie der Trigger angezeigt und bewirkt, dass der Trigger Ihre Anweisung ignoriert.
Beispiel eines Triggers:
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
Beispiel für eine beginnende Anweisung, wenn der Trigger nicht ausgeführt werden soll:
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
Putting es insgesamt für Ihr Beispiel:
ALTER TRIGGER tiu_benefit ON benefit FOR
...
AS
...
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
--... rest of code here
GO
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
UPDATE benefit SET editor = 'srh' where benefit_id = 9876;
GO