あなたの問題を解決するために、私たちは問題に対してプログラム的なアプローチをとる必要があります。ここには2つのルートがあります。これらのアプローチが必要な理由は、特定のステートメントのトリガーを無効にすることはできず、テーブル全体に対してのみ無効にできるためです。
オプション1:Context_Info()
MS SQL TipsのSamuel Vangaには素晴らしい例がありました。
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
サミュエルがトリガーの実行を望まない場合、これを使用します。
SET Context_Info 0x55555
INSERT dbo.Table1 VALUES(100)
Context_Info
次のシステムビューを使用して、現在のセッションに関する情報を取得します。
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses
ここでのイデオロギーは、設定しているバイナリ文字列は現在のセッションにのみ公開されるため、セッション中にトリガーを実行すると、Context_info
関数のスコープと変数設定が表示され、トリガーのエスケープ部分にジャンプします代わりに。
オプション2:一時テーブル
Itzik Ben-Ganは、彼の著書「Microsoft SQL Server 2008の内部T-SQLプログラミング:T-SQLプログラミング」で優れたソリューションを提供しています。このcontext_info
機能に関する主な問題は、マイナーなTempDBオーバーヘッドです。
驚きを台無しにして、本のプロットを台無しにしないように(購入して読む価値があると感じました)、トリガーを変更します。
トリガーは一時テーブルのチェックを実行する必要があります。一時テーブルが存在する場合、トリガーはアクションを実行せずに終了することを知っている必要があります。
実行する更新ステートメントで、最初に一時テーブルを作成します。トリガーと同じトランザクションで表示され、トリガーがステートメントを無視する原因になります。
トリガーの例:
CREATE TRIGGER TRIGGERNAME ON TABLENAME for INSERT AS
IF OBJECT_ID('tempdb..#FAKETEMPTABLE') IS NOT NULL RETURN;
GO
トリガーを実行したくない場合の開始ステートメントの例:
CREATE TABLE #FAKETEMPTABLE(col1 SMALLINT);
あなたの例のために完全にそれを入れて:
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