Sql 触发器不会执行存储过程

Sql 触发器不会执行存储过程,sql,sql-server,triggers,database-trigger,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行。从那一刻起

我有以下触发因素:

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

触发器不太可能不运行。在触发器中的过程调用周围添加几个print语句,最终也添加到存储过程中。这将帮助您在ManagementStudio中运行update语句以触发触发器时跟踪执行情况

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
然后在ManagementStudio中运行update语句,并检查Messages选项卡以查看您的消息是否已打印

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

不,您不需要游标。执行触发器时,如果影响多行,则插入/删除的伪表中也会有多行。在您的情况下,您也不会读取更新了哪些行,因此只需运行该过程。若您需要确切地知道修改了哪些行,那个么就编写代码,以基于集合的方法处理它们(一次修改所有行)。在数据库中使用游标循环实际上从来都不是一个好主意。

触发器不太可能不运行。在触发器中的过程调用周围添加几个print语句,最终也添加到存储过程中。这将帮助您在ManagementStudio中运行update语句以触发触发器时跟踪执行情况

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
然后在ManagementStudio中运行update语句,并检查Messages选项卡以查看您的消息是否已打印

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

不,您不需要游标。执行触发器时,如果影响多行,则插入/删除的伪表中也会有多行。在您的情况下,您也不会读取更新了哪些行,因此只需运行该过程。若您需要确切地知道修改了哪些行,那个么就编写代码,以基于集合的方法处理它们(一次修改所有行)。在数据库中使用游标循环实际上从来都不是一个好主意。

在测试环境中使用SQL Profiler观看时,您是否尝试过运行此功能?这可能会告诉你更多关于正在发生(或没有发生)的事情。这是一个托管服务器,我没有访问探查器的权限。托管公司说他们不允许批量插入。我不知道这是否与此有关。考虑到您没有引用插入的
,也没有向存储过程传递任何参数,我不明白您为什么需要游标。(另外,您听错了,您不需要使用游标来处理insert/update/etc中的多行,只需将数据当作数据库中的所有数据集来处理即可)。SP很可能已被解雇,但它没有按您认为的那样工作。但是,在不知道SP的定义的情况下,无法确定您在测试环境中使用SQL Profiler观看时是否尝试过运行此程序?这可能会告诉你更多关于正在发生(或没有发生)的事情。这是一个托管服务器,我没有访问探查器的权限。托管公司说他们不允许批量插入。我不知道这是否与此有关。考虑到您没有引用插入的
,也没有向存储过程传递任何参数,我不明白您为什么需要游标。(另外,您听错了,您不需要使用游标来处理insert/update/etc中的多行,只需将数据当作数据库中的所有数据集来处理即可)。SP很可能已被解雇,但它没有按您认为的那样工作。在不知道SP的定义的情况下,我尝试了print语句,结果发现有一个以前不可见的模式。当我添加这个[SomeSchema.][Staging].[PivotData]时,它起作用了。谢谢你的帮助,我学会了如何调试触发器。我只需要等待,看看它是否会自动运行。在数据库中使用游标循环实际上从来都不是一个好主意——在触发器中更是如此——触发器应该非常小、快速和灵活——这与“游标”不符……如果我按照上面的建议手动执行,它工作得很好。但它不会自动工作。所谓“正常工作”,我的意思是它触发已独立测试的存储过程。使用正常插入,触发器将触发(除非禁用),您在SSMS中尝试过,并证明它可以工作。因此,在这种情况下,您的插入看起来不是正常插入。这些行是使用例如插入的吗?在这种情况下,默认情况下不会触发触发器,除非指定了fire_triggers选项。我尝试了print语句,这导致我发现有一个以前不可见的模式。当我添加这个[SomeSchema.][Staging].[PivotData]时,它起作用了。谢谢你的帮助,我学会了如何调试触发器。我只需要等待,看看它是否会自动运行。在数据库中使用游标循环实际上从来都不是一个好主意——在触发器中更是如此——触发器应该非常小、快速和灵活——这与“游标”不符……如果我按照上面的建议手动执行,它工作得很好。但它不会自动工作。所谓“正常工作”,我的意思是它触发已独立测试的存储过程。使用正常插入,触发器将触发(除非禁用),您在SSMS中尝试过,并证明它可以工作。因此,在这种情况下,您的插入看起来不是正常插入。这些行是使用例如插入的吗?在这种情况下,默认情况下不会触发触发器,除非指定了fire_triggers选项。