触发器将不执行存储过程

时间:2018-11-10 12:25:37

标签: sql sql-server triggers database-trigger

我有以下触发器:

USE SomeDB
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [Staging].[RunPivot15] 
ON [Staging].[UriData]
AFTER INSERT, UPDATE 
AS 
BEGIN
    SET NOCOUNT ON
    EXEC [Staging].[PivotData]
END

它不会发射。该表每五分钟接收约30行。从那时起,我陷入困境。我一直在读,因为要插入多行,所以我必须运行一个游标。我尝试过光标,但也无法使它起作用。

您能告诉我们最好的方法是什么吗?

TIA

1 个答案:

答案 0 :(得分:2)

触发器极不可能不运行。在触发器中,最后在存储过程中,在过程调用周围添加几个打印语句。当您在Management Studio中运行更新语句以触发触发器时,这将帮助您跟踪执行。

USE SomeDB
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO    

ALTER TRIGGER [Staging].[RunPivot15] 
ON [Staging].[UriData]
AFTER INSERT, UPDATE 
AS 
BEGIN
    SET NOCOUNT ON
    PRINT 'Before call.'
    EXEC [Staging].[PivotData]
    PRINT 'After call.'
END

然后在Management Studio中运行一条更新语句,然后检查“消息”选项卡以查看是否打印了您的消息。

update Staging.RunPivot15 set SomeColumn = SomeColumn where SomeColumn = SomeValue

否,您不需要游标。当执行触发器时,如果影响了多行,则在插入/删除的伪表中也将有多行。在您的情况下,您也不阅读要更新的行,因此只需运行该过程即可。如果您需要知道确切地修改了哪些行,请编写代码以基于集合的方式处理它们(一次所有行)。在数据库中,游标循环实际上绝不是好主意。