【问题标题】:Best Way to call a Web Service from TSQL从 TSQL 调用 Web 服务的最佳方式
【发布时间】:2010-04-21 13:23:48
【问题描述】:

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

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

【问题讨论】:

    标签: sql-server web-services sql-server-2005 tsql sql-server-2008


    【解决方案1】:

    从我所听到的一切来看,从数​​据库“内”的任何地方进行网站调用都不是一种“最佳实践”,而从触发器内进行网络调用会让我畏缩 [延迟、延迟、阻塞,死锁... oog]。数据库是很好的后端,但前端却很差。让一个专门的应用程序来协调您的网络和数据库可能会好得多。

    将某些内容连接到 SQL 代理调用中可能会起作用,但请注意,没有从作业步骤中调用网站的“本地”方式。他们可能是故意这样设计的。

    【讨论】:

      【解决方案2】:

      我知道您可以在 SQL Server 中嵌入 .NET CLR 代码,但是否可以从触发器调用 CLR 代码,我不知道。 我会考虑一种不同的架构,让一个表在您需要调用 Web 服务时插入记录,并运行一个外部应用程序来轮询表,并从那里调用 Web 服务。 如果您尝试直接在触发器内调用 Web 服务,您将在调试、错误记录等方面遇到很多麻烦。 只是我的 2 美分。

      【讨论】:

      • +1,我不认为在 SQL 事务中调用 Web 服务是个好主意。每个触发器在带有触发语句的自动事务中运行。您将为整个事务持有锁,如果您围绕触发命令和其他命令有自己的事务,您将拥有更多时间。触发器需要非常快地运行,否则您的系统会变慢。
      【解决方案3】:

      正如这里已经提到的,从触发器调用 Web 服务会降低数据库性能,因为调用需要时间。

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

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

      【讨论】:

        【解决方案4】:

        正如@Keith 的回答中提到的那样,完全调用网络服务可能非常糟糕。想象一下,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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多