Aby rozwiązać Twój problem, musimy przyjąć programowe podejście do problemu. Możesz tu iść dwiema drogami. Powodem potrzeby takich podejść jest to, że nie można wyłączyć wyzwalacza dla określonej instrukcji, można ją wyłączyć tylko dla całej tabeli.
Opcja 1: Context_Info ()
Samuel Vanga na MS SQL Tips miał świetny przykład:
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
Teraz, gdy Samuel nie chce, aby wyzwalacz był wykonywany, używają tego:
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
korzysta z następujących widoków systemu, aby pobrać informacje dotyczące bieżącej sesji:
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
Ideologia polega na tym, że ustawiony ciąg binarny jest wystawiany tylko na bieżącą sesję, więc gdy wyzwalacz zostanie wykonany podczas sesji, zobaczy zakres i zmienne ustawienie Context_info
funkcji i przeskoczy do części zmiany znaczenia wyzwalacza zamiast.
Opcja 2: Tabela temperatur
Itzik Ben-Gan ma świetne rozwiązanie w swojej książce „Inside Microsoft SQL Server 2008 T-SQL Programming: T-SQL Programming”, która znajduje się również w jego późniejszej książce T-SQL Querying . Podstawowym problemem związanym z tą context_info
funkcją jest niewielki narzut TempDB.
Aby zepsuć niespodziankę, ale nie zrujnować fabuły książek (czułem, że warto je kupić i przeczytać), zmienisz spust.
Twój wyzwalacz powinien wykonać sprawdzenie tymczasowego stołu. Jeśli tabela tymczasowa istnieje, wyzwalacz powinien wiedzieć, aby zakończyć i nie wykonywać akcji.
W instrukcji aktualizacji, którą chcesz wykonać, najpierw utwórz tabelę tymczasową. Będzie widoczny w tej samej transakcji co wyzwalacz i spowoduje, że wyzwalacz zignoruje twoje polecenie.
Przykład wyzwalacza:
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
Przykład instrukcji początku, gdy nie chcesz, aby wyzwalacz działał:
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
Podsumowując, przykład:
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