2

誰かが私のトリミングされた例を再確認できますか?Documentsテーブルが更新されたら、QueueテーブルのEntryDateを更新したいと思います。ただし、このプロセスでのみキューテーブルのトリガーを起動したくありません。つまり、このプロセスの実行中に他のプロセスがキューテーブルのEntryDateを更新した場合、その特定のトランザクションに対してキューテーブルのトリガーを起動する必要があります。他のプロセスが足を踏み入れないようにするために、以下のコードに対して何らかのロックアウトを行う必要があるかどうかはわかりません。ありがとう!

create trigger [dbo].[Documents_trigUpdate] on [dbo].[Documents]
for update
as

begin transaction

alter table [Queue] disable trigger Queue_trigUpdate
update  [Queue] set EntryDate = getdate()
alter table [Queue] enable trigger Queue_trigUpdate

commit transaction

go
4

3 に答える 3

11

現在のプロセスだけでなくすべてのプロセスに影響するため、トリガーを無効にしてから再度有効にすることは避けてください。ある種のロックをかけると、コードがシリアル化され、システムのボトルネックになる可能性があります。

別の方法は、現在の接続のを使用し、特定のコンテキストが設定されている場合に実行されないようContext_infoにのトリガーを変更することです。Queue

この手法についてはこの記事で説明し、例を以下に示します。

-- Creating the queue trigger
create trigger [dbo].[Queue_trigUpdate] on [dbo].[Queue]
for update
as   

declare @Cinfo varbinary(128)  
select @Cinfo = Context_Info()  
if @Cinfo = 0x55555  
    return  

print 'Trigger Executed'  
-- Actual code goes here  
go

トリガーが実行されないようにするには、次のようにします。

create trigger [dbo].[Documents_trigUpdate] on [dbo].[Documents]
for update
as

-- Save the original context info    
declare @originalContextInfo VARBINARY(128)
set @originalContextInfo = Context_Info()

set Context_Info 0x55555 
update  [Queue] set EntryDate = getdate()

-- Reset the context info
set Context_Info @originalContextInfo 
go
于 2012-08-01T19:53:37.580 に答える
0

私は以前にこれを行ったことがあり、それがそれを行うための最良の方法であるか、それとも正確にあなたが望むものであるかはわかりませんが、CONTEXT_INFO()を使用できます。

無視するプロセスで、次を実行します。

DECLARE @ContextInfo varbinary(128)
SET @ContextInfo = CAST('SomethingMeaningfulToYou' AS varbinary(128))
SET Context_Info @ContextInfo 

次に、トリガーで、たとえば行を更新します。

CREATE TRIGGER X 
ON TABLE Y 
AFTER UPDATE AS
BEGIN
    UPDATE Something
    SET something = somethingelse
    WHERE yourconditions AND 
         (CONTEXT_INFO IS NULL OR CONTEXT_INFO() <> CAST('SomethingMeaningfulToYou' AS varbinary(128)))
END
于 2012-08-01T19:53:33.933 に答える
-2

DISABLE TRIGGERに電話をかけていくつかの作業を実行し、完了したらENABLETRIGGERに電話をかけることができるはずです。

于 2012-08-01T19:52:11.797 に答える