代码之家  ›  专栏  ›  技术社区  ›  John Hartsock

从TSQL调用Web服务的最佳方法

  •  1
  • John Hartsock  · 技术社区  · 14 年前

    从TSQL调用Web服务的最佳方法是什么?我想写一些调用Web服务的触发器。是否有一个普遍使用的最佳实践?

    需要在SQL Server 2005和2008中处理实现

    4 回复  |  直到 9 年前
        1
  •  6
  •   Philip Kelley    14 年前

    从我所听到的每一件事来看,从数据库的任何“内部”进行网站调用都不是一种“最佳实践”,从触发器内部进行Web调用会让我退缩[延迟、延迟、阻塞、死锁…OOG.数据库的后端很好,但前端却很差。让一个专用的应用程序做你的Web和数据库的协调,你可能会好多了。

    将某些东西连接到SQL代理调用中可能会起作用,但请注意,没有“本机”方法可以从作业步骤中调用网站。他们可能是故意设计的。

        2
  •  6
  •   Jeremy    14 年前

    我知道您可以在SQL Server中嵌入.NET CLR代码,但我不知道是否可以从触发器调用CLR代码。 我会考虑一种不同的架构,通过让一个表在您需要调用Web服务时随时插入记录,并运行一个外部应用程序来轮询该表,然后从那里调用Web服务。 如果您试图直接在触发器内部调用Web服务,那么调试、错误日志记录等就会出现很多问题。 只有我的2美分。

        3
  •  3
  •   Keith Bloom    11 年前

    如前所述,从触发器调用Web服务将导致数据库性能下降,这是由于调用所需的时间。

    SQL Server没有名为 SQL Server Broker 它是为将异步消息传递集成到SQL Server而设计的。虽然我现在有自己使用它的经验,但如果您希望将所有处理逻辑保留在SQL Server中,这可能是一个很好的起点。

    如果可以的话,我建议将调用服务的责任转移到使用数据库的任何应用程序上。在这个级别上,您将能够在不占用数据库的情况下处理延迟。

        4
  •  1
  •   Jason Goemaat    9 年前

    正如@keith在回答中提到的,完全调用Web服务可能是非常糟糕的。假设Web服务已关闭,并且您有许多更新被锁定,并且正在等待访问您的数据。但是,您可以使用SQL Service Broker, here is a good tutorial 在触发器中使用它们。以下是队列设置后的示例触发器代码。您始终可以创建一个监视队列的服务,如果需要,还可以实际调用Web服务。

    --Create trigger for update
    CREATE  TRIGGER dbo.Trg_DepartmentMaster_Update 
        ON  dbo.DepartmentMaster FOR UPDATE 
    AS BEGIN
        SET NOCOUNT ON;
        DECLARE @MessageBody XML  
        DECLARE @TableId int 
    
        --get relevant information from inserted/deleted and convert to xml message  
        SET @MessageBody = (SELECT DepartmentId,Name,Description FROM inserted FOR XML AUTO)
    
        If (@MessageBody IS NOT NULL)  
        BEGIN 
            DECLARE @Handle UNIQUEIDENTIFIER;   
            BEGIN DIALOG CONVERSATION @Handle   
            FROM SERVICE [TestServiceInitiator]   
            TO SERVICE 'TestServiceTarget'   
            ON CONTRACT [TestContract]   
            WITH ENCRYPTION = OFF;   
            SEND ON CONVERSATION @Handle   
            MESSAGE TYPE [TestMessage](@MessageBody);
        END
    END