【发布时间】:2010-04-21 13:23:48
【问题描述】:
从 TSQL 调用 Web 服务的最佳方式是什么?我想编写一些调用 Web 服务的触发器。对此是否有普遍使用的最佳实践?
需要在 SQL Server 2005 和 2008 中处理实现
【问题讨论】:
标签: sql-server web-services sql-server-2005 tsql sql-server-2008
从 TSQL 调用 Web 服务的最佳方式是什么?我想编写一些调用 Web 服务的触发器。对此是否有普遍使用的最佳实践?
需要在 SQL Server 2005 和 2008 中处理实现
【问题讨论】:
标签: sql-server web-services sql-server-2005 tsql sql-server-2008
从我所听到的一切来看,从数据库“内”的任何地方进行网站调用都不是一种“最佳实践”,而从触发器内进行网络调用会让我畏缩 [延迟、延迟、阻塞,死锁... oog]。数据库是很好的后端,但前端却很差。让一个专门的应用程序来协调您的网络和数据库可能会好得多。
将某些内容连接到 SQL 代理调用中可能会起作用,但请注意,没有从作业步骤中调用网站的“本地”方式。他们可能是故意这样设计的。
【讨论】:
我知道您可以在 SQL Server 中嵌入 .NET CLR 代码,但是否可以从触发器调用 CLR 代码,我不知道。 我会考虑一种不同的架构,让一个表在您需要调用 Web 服务时插入记录,并运行一个外部应用程序来轮询表,并从那里调用 Web 服务。 如果您尝试直接在触发器内调用 Web 服务,您将在调试、错误记录等方面遇到很多麻烦。 只是我的 2 美分。
【讨论】:
正如这里已经提到的,从触发器调用 Web 服务会降低数据库性能,因为调用需要时间。
SQL Server 确实有一个名为SQL Server Broker 的功能,该功能旨在将异步消息传递集成到 SQL Server 中。虽然我现在有自己使用它的经验,但如果您希望将所有处理逻辑保留在 SQL Server 中,这可能是一个很好的起点。
如果可以的话,我建议将调用服务的责任转移到使用数据库的任何应用程序上。在这个级别,您将能够在不占用数据库的情况下处理延迟。
【讨论】:
正如@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
【讨论】: