【问题标题】:T-SQL execute Trigger on Update and on IF conditionT-SQL 在更新和 IF 条件下执行触发器
【发布时间】:2017-11-30 05:24:28
【问题描述】:

我目前正在 SQL Server 2014 上的 T-SQL 中处理存储过程。

我正在寻找一种方法或想知道是否可以在更新表时执行触发器,但前提是如果条件为真。

-- 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 ipsum text”?如果没有,请检查插入的触发器,看看它是否需要更进一步。
  • 谢谢,好点检查插入触发器! ...说实话,模型有点复杂。在我的实际应用程序中,我需要更新 ProjectTable 中的另一个 Id,当创建一个新版本时......这只是一个简单的例子 :) 谢谢!

标签: sql-server tsql stored-procedures triggers


【解决方案1】:

在执行@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

【讨论】:

  • 这是个坏主意 - 当同时调用此过程时会发生什么,一个将@IsVersion 设置为0,另一个使用1?禁用触发器是一个全局设置。
【解决方案2】:

当两条过程式 T-SQL 需要在它们之间传递信息但它们不直接相互调用(因此参数不是一个选项)时,您可以使用 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

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

【讨论】:

  • 这非常适合我的需要!非常感谢您的出色解决方案! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2017-10-08
相关资源
最近更新 更多