从SQL Server触发器调用Freshdesk API

从SQL Server触发器调用Freshdesk API,sql,sql-server,triggers,freshdesk,Sql,Sql Server,Triggers,Freshdesk,我的客户希望在他的订单表(来自Sage)上有一个insert触发器,以使用API创建Freshdesk票据 作为开发的一部分,我构建了一个存储过程,当提供订单号时,它可以很好地完成这项工作。但是,将相同的代码移植到触发器中不会返回错误,但当存储过程中的相同代码工作时,Freshdesk系统中不会出现任何错误 我想知道为什么在触发器中调用API可能是个坏主意,但是Freshdesk调用非常快(如果您只是从触发器(通过EXEC)调用您的工作存储过程,而不是将过程的代码包含在触发器中,会发生什么情况

我的客户希望在他的订单表(来自Sage)上有一个insert触发器,以使用API创建Freshdesk票据

作为开发的一部分,我构建了一个存储过程,当提供订单号时,它可以很好地完成这项工作。但是,将相同的代码移植到触发器中不会返回错误,但当存储过程中的相同代码工作时,Freshdesk系统中不会出现任何错误


我想知道为什么在触发器中调用API可能是个坏主意,但是Freshdesk调用非常快(如果您只是从触发器(通过
EXEC
)调用您的工作存储过程,而不是将过程的代码包含在触发器中,会发生什么情况


需要仔细观察的一点是代码中的以下位置:

  -- Collect field values that were just inserted
  SELECT
    @EMAIL = rtrim(OEORDH1.SHPEMAILC), @SHPCONTACT = rtrim(SHPCONTACT),
    @ORDNUMBER = rtrim(ORDNUMBER), @LOCATION = LOCATION, @EXPDATE = EXPDATE,
    @SHPPHONEC = rtrim(OEORDH1.SHPPHONEC), @SHPNAME = SHPNAME,
    @DESCR = rtrim([DESC]), @CODEEMPL = rtrim(ARSAP.CODEEMPL)
  -- FROM inserted
  FROM dbo.OEORDH
  JOIN dbo.OEORDH1 on dbo.OEORDH.ORDUNIQ   = dbo.OEORDH1.ORDUNIQ
  JOIN dbo.ARSAP   on dbo.OEORDH.SALESPER1 = dbo.ARSAP.CODESLSP
  WHERE ORDNUMBER = @ORDNUM
您从插入的
中注释掉了
,并尝试直接从表中读取值

当触发代码运行时,事务尚未提交,因此您很可能应该从插入的
表中读取值。很可能此
SELECT
未找到具有给定
@ORDNUM
的行,并且变量保持为
NULL


旁注。SQL Server中的触发器在每个语句中触发一次,而不是每行触发一次。即使插入的
表有多行,触发器也应正常工作。现在,即使在表中插入了多行,触发器也只会选择一个
ORDNUMBER
。很可能这不是您想要的


如何调试触发器


一种简单而直接的方法是创建一个记录表,并添加大量的
INSERT
语句,将所有变量的值记录到该表中。然后您可以通读日志并查看发生了什么。

不,这不是禁止的。通常,问题在于为触发器编写的代码。搜索pos对于许多与触发器相关的问题,几乎总是涉及到关于糟糕的编码实践、无效的假设和更好的解决方案的讨论。要么这样,要么发布触发器代码。这里是触发器代码:不-那不是您的触发器代码。充其量,它只是您触发器代码的一部分。发布所有的-然后描述它的作用。s由于您声称它在存储过程中工作,那么您最简单的方法(这并不意味着“最佳”)可能是在触发器中调用您的过程。您当然需要添加错误处理。“Freshdesk调用非常快”-可能是这样-当一切都正常工作时。现在假设有一个DNS问题导致查找失败(30秒后)或者在网络路径上有一个问题。或者说,新一代正在经历某种类型的中断。这是在决定要插入一个订单的原始事务之前应该考虑的事情。为什么引入某种形式的排队(例如服务代理)几乎总是更好的。因此,网络问题不会影响原始事务。我同意,从长远来看,此解决方案可能会失败。但是,我正在试图理解为什么它在目前没有DNS问题的情况下不起作用。当从存储过程手动运行时,代码似乎工作得很好。当它在aut运行时,代码似乎也会无声地失败从触发器内部进行操作,我正在尝试理解原因。谢谢。没有解释(或者更确切地说,我不理解)的是触发器的世界是一个尚未正式存在的世界。我正在进行的多表联接涉及第二个表(OEORDH1)其记录也可能尚未正式存在,导致连接失败,因此触发器返回错误。@talexb,如果需要从定义触发器的表之外的其他表中获取数据,则需要小心。我对此类触发器没有太多经验,但我会尝试显式启动事务,添加首先将所需数据插入“other”表(
OEORDH1
),然后插入主表,触发器应在同一事务中触发。仅在插入主表后显式提交事务。您需要进行检查,但我希望触发器在“other”中“查看”新数据表,如果它插入到与主tableTriggers相同的事务中,则会在覆盖原始语句的事务上下文中运行。因此,您担心无法“此选择可能找不到具有给定@ORDNUM…的行”无效。与在单个事务中始终可以读回已插入的行的方式相同。@Damien_,不信者,你是对的。
插入的
表中可见的行如果直接引用原始表也可见。结果表明,在这种特定情况下,在这也在发生变化(目前还不清楚到底是如何变化的),这可能会使一切变得复杂。