T-SQL在更新和IF条件下执行触发

时间:2017-06-27 08:26:34

标签: sql-server tsql stored-procedures triggers

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

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

-- 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,是否有可能以某种方式执行触发?

你会如何解决这个问题......非常感谢你!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

执行@IsVersion = 0的代码时禁用触发器,更新后再次启用它。

from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse
import numpy as np

A =  np.array([[0, 1, 2, 0, 0], [0, 0, 1, 1, 2],[0, 1, 0, 1, 0]])
A_sparse = sparse.csr_matrix(A)

similarities = cosine_similarity(A_sparse)
print('pairwise dense output:\n {}\n'.format(similarities))