2017-06-27 17 views
1
私は現在、私は方法を探していますか、それはだかどうかを知りたいと思い、2014年

T-SQLは、更新にトリガを実行し、上のIF条件

SQL Server上でT-SQLストアドプロシージャに取り組んでいます

をif-conditionがtrueの場合のみ、テーブルの更新でトリガを実行することができます。

-- table project 
--CREATE TABLE [MySchema].[Project] (
-- ProjectId INT 
-- , Label VARCHAR(1000) 
--); 

-- trigger 
CREATE TRIGGER trgUpdate_Project 
    ON [MySchema].[Project] 
    FOR UPDATE 
AS 
BEGIN 
    IF UPDATE ([Label]) 
     PRINT 'Label updated, version 1' 
END 
GO 

-- stored procedure 
CREATE PROCEDURE [MySchema].[SaveProject] 
    -- Importing Parameters 
    @IsVersion BIT 
    , @Label VARCHAR(1000) 
AS 
BEGIN 
    IF @IsVersion = 0 -- don't execute trigger 
    BEGIN 
     UPDATE [A] 
     SET [A].Label = 'lorem ipsum text' 
     FROM [MySchema].[Project] AS [A] 
     WHERE [A].ProjectId = '1' 
    END 


    IF @IsVersion = 1 -- execute Trigger 
    BEGIN 
     UPDATE [A] 
     SET [A].Label = @Label 
     FROM [MySchema].[Project] AS [A] 
     WHERE [A].ProjectId = '1' 
    END 

END 

@IsVersion = 1の場合、何とかトリガーを実行できますか?

どうすれば解決できますか...ありがとうございます!

+1

は、ラベルがこれまでに 'Loremのイプサムのテキスト' に設定するのでしょうか?そうでない場合は、トリガーに挿入されているチェックボックスをチェックして、それ以上進まなければならないかどうかを確認します。 – Leonidas199x

+0

トリガに挿入したことを確認していただきありがとうございます! ...正直言って、モデルは少し複雑です。私の実際のアプリケーションでは、新しいバージョンが作成されると、ProjectTableの別のIDを更新する必要があります...これは単なる例です:)ありがとう! – TimHorton

答えて

2

手続きT-SQLの2枚は、それらの間の情報を伝達するための手段を必要とするが、それらが互いに直接呼び出しされていない(ので、パラメータはオプションではありません)ときはSession Contextを使用することができます。 すべてのコードは、トリガーを起動させる変更を行う前にセッションコンテキスト情報を変更することを選択できます。

のような何か:

CREATE TRIGGER trgUpdate_Project 
    ON [MySchema].[Project] 
    FOR UPDATE 
AS 
BEGIN 
    IF CONTEXT_INFO() = 0x56455253494F4E30 RETURN 
    IF UPDATE ([Label]) 
     PRINT 'Label updated, version 1' 
END 

とバージョンが1に設定されている場合は

CREATE PROCEDURE [MySchema].[SaveProject] 
    -- Importing Parameters 
    @IsVersion BIT 
    , @Label VARCHAR(1000) 
AS 
BEGIN 
    IF @IsVersion = 0 -- don't execute trigger 
    BEGIN 
     SET CONTEXT_INFO 0x56455253494F4E30 
     UPDATE [A] 
     SET [A].Label = 'lorem ipsum text' 
     FROM [MySchema].[Project] 
     WHERE [A].ProjectId = 1 
    END 


    IF @IsVersion = 1 -- execute Trigger 
    BEGIN 
     SET CONTEXT_INFO 0x56455253494F4E31 
     UPDATE [A] 
     SET [A].Label = @Label 
     FROM [MySchema].[Project] 
     WHERE [A].ProjectId = 1 
    END 

END 
+0

これは私のニーズに非常にうまく機能します!優れたソリューションに感謝します! :) – TimHorton

0

@IsVersion = 0のコードを実行するときにトリガーを無効にし、更新後にもう一度有効にします。

IF @IsVersion = 0 -- don't execute trigger 
BEGIN 
    ALTER TABLE [MySchema].[Project] DISABLE TRIGGER trgUpdate_Project; 

    UPDATE [A] 
    SET [A].Label = 'lorem ipsum text' 
    FROM [MySchema].[Project] 
    WHERE [A].ProjectId = 1 

    ALTER TABLE [MySchema].[Project] ENABLE TRIGGER trgUpdate_Project; 
END 
+4

これは悪い考えです。この手続きを2回同時に呼び出すと、 '@IsVersion'が' 0'に設定され、もう1つが '1'に設定されるとどうなりますか?トリガーを無効にすることは*グローバル*設定です。 –

関連する問題