Sorununuzu çözmek için, soruna programlı bir yaklaşım izlemeliyiz. Buraya gidebileceğiniz iki rota var. Bu yaklaşımlara ihtiyaç duymanın nedeni, belirli bir ifade için tetikleyiciyi devre dışı bırakamamanızdır, yalnızca tablonun tamamı için devre dışı bırakılabilir.
1. Seçenek: Context_Info ()
MS SQL Tips'teki Samuel Vanga'nın harika bir örneği vardı:
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
Şimdi Samuel tetiğin yürütülmesini istemediğinde bunu kullanıyorlar:
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
geçerli oturumla ilgili bilgileri almak için aşağıdaki sistem görünümlerini kullanır:
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
Buradaki ideoloji, ayarladığınız ikili dizginin yalnızca geçerli oturuma maruz kalmasıdır, bu nedenle tetikleyici oturumunuz sırasında yürütüldüğünde, Context_info
işlevin kapsamını ve değişken ayarını görür ve tetikleyicinin çıkış bölümüne atlar. yerine.
Seçenek 2: Sıcaklık Tablosu
Itzik Ben-Gan bir sahiptir harika bir çözüm onun daha sonraki kitabında da: kitabında "T-SQL programlama İçinde Microsoft SQL Server 2008, T-SQL programlama" in T-SQL Sorgulama . Bu context_info
işlev üzerindeki birincil sorun , küçük TempDB yüküdür.
Sürprizi bozmak ama kitapların arsalarını mahvetmek için (satın almaya ve okumaya değer olduklarını hissettim), tetikleyicinizi değiştireceksiniz.
Tetikleyiciniz geçici bir tablo için bir kontrol gerçekleştirmelidir. Geçici tablo varsa, tetikleyici işlemi sonlandırmalı ve eylemleri gerçekleştirmemelidir.
Gerçekleştirmek istediğiniz güncelleme deyiminde, önce geçici tabloyu oluşturun. Tetikleyici ile aynı işlemde görülür ve tetikleyicinin ifadenizi yoksaymasına neden olur.
Tetikleyici örneği:
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
Tetiğin çalışmasını istemediğinizde başlangıç ifadesine örnek:
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
Örneğiniz için bir araya getirmek:
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