我目前正在使用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,是否有可能以某种方式执行触发?
你会如何解决这个问题......非常感谢你!
答案 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))