4

私は次のトリガーを持っています

最初のトリガー:

ALTER TRIGGER [dbo].[DIENSTLEISTUNG_Update]
ON [dbo].[DIENSTLEISTUNG]
INSTEAD OF UPDATE
AS

BEGIN
    SET  NOCOUNT ON;
    DECLARE @intNewID int

         INSERT INTO [DIENSTLEISTUNG] 
         (DESCRIPTION, QUANTITY, 
         PRICE, AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
         AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
         UPDATE_USER, UPDATE_DATE,
         PERMISSIONS, KONTRAKTPOSITION,ITEMNUMBER,
         PRIORITY, VALID)

         SELECT  i.DESCRIPTION, i.QUANTITY, i.PRICE, i.AZ_MO, 
         i.AZ_DI,i.AZ_MI,i.AZ_DO,i.AZ_FR,       
         i.AZ_SA,i.AZ_SO,i.SERVICETYPE_ID, i.UPDATE_USER,GETDATE(),
         i.PERMISSIONS, i.KONTRAKTPOSITION,i.ITEMNUMBER, i.PRIORITY, 'Y'

         FROM INSERTED i
         JOIN deleted d ON i.ID=d.ID
         WHERE i.PRICE<>d.PRICE
         or i.DESCRIPTION<>d.DESCRIPTION


         IF ( UPDATE (PRICE) OR UPDATE (DESCRIPTION) )
         UPDATE  S
         SET  s.VALID = 'N'    
         FROM SERVICE s
         JOIN INSERTED i ON I.ID = S.ID


         IF UPDATE(PRIORITY)
         UPDATE s
         SET s.PRIORITY= i.PRIORITY
         FROM SERVICE s
         JOIN INSERTED i ON i.ID = s.ID

   SET NOCOUNT OFF;      
END

最初のトリガーは、元の行に変更が発生した場合に新しいIDで行全体をコピーし、トリガーもフラグを設定します。古い行がフラグVALID = 'N'を取得し、新しい行がフラグを取得しVALID = 'Y'ます。トリガーは、PRICEまたはDESCRIPTIONが更新された場合にのみ新しい行を作成します。ここまでは順調ですね。

私の問題は、新しい行のを更新したい場合PRIORITY、トリガーが再度起動し、フラグをに設定することVALID = 'N'です。それは起こらないはずです。新しい行を作成したり、別の列を更新したりせずに、優先度を更新するだけです。

手伝ってくれてありがとう

4

3 に答える 3

2

トリガーの起動を防ぐことはできません。トリガーが存在し、無効になっていない場合は、トリガーが起動します。これがトリガーの仕組みです。

できることは、トリガー内でどの列が更新されたかを確認することです。したがって、1つのトリガーで次のようなことを行うことができます。

CREATE TRIGGER [dbo].[DIENSTLEISTUNG_Update]
ON [dbo].[DIENSTLEISTUNG]
FOR UPDATE
AS
    IF UPDATE(PRICE) 
      ... (do what you need to do if PRICE is updated)...

    IF UPDATE(DESCRIPTION)
      ... (do what you need to do if DESCRIPTION is updated)...

    IF UPDATE(PRIORITY)
      ... (do what you need to do if PRIORITY is updated)...

この関数を使用してUPDATE()、特定の列が更新されているかどうかを確認し、更新されている場合はそれに基づいて操作します。関数の使用方法については、MSDNのドキュメントをUPDATE()参照してください。

于 2012-07-31T09:56:09.197 に答える
1

特定の列または1つの列でのみトリガーを起動させることができます。このような。

CREATE TRIGGER tr_something ON myTable
FOR INSERT, UPDATE
AS
IF UPDATE(myColumn)
BEGIN
--       do what you want
END

以下の投稿は詳細を示しています、私は遅くなるようです:)

于 2012-07-31T09:59:02.273 に答える
0

あなたができることはあなたがこのようにいるセッションのコンテキスト情報を設定することです:

SET Context_Info 0x55555

次に、トリガーでコンテキスト情報を確認して、何をするかを決定します。

DECLARE @Cinfo VARBINARY(128)  
SELECT @Cinfo = Context_Info()  
IF @Cinfo = 0x55555  
    RETURN
于 2021-07-07T08:41:19.210 に答える