我想在将行插入表时调用 Web 服务。所以我启用Ole Automation Procedures
,像下面那样调用 Webservice,一切都很好。
--enabling 'Ole Automation Procedures'
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
--calling Webservice
create PROCEDURE callwebservice
@url varchar(128)=null
AS
Declare @Object as Int;
Declare @ResponseText as varchar(8000);
Exec sp_OACreate 'MSXML2.ServerXMLHttp.3.0', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get', @url ,'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAGetProperty @Object, 'ResponseText', @ResponseText OUTPUT
Exec sp_OADestroy @Object
return
但是,由于 Webservice 调用非常冗长,我需要使用 Service Broker 来完成。所以我创建了一个新的存储过程并将其作为我的激活参数传递,Queue
如下所示:
--declare procedure
create procedure handleNewMessageInQueue
as
begin
DECLARE @TargetDlgHandle UNIQUEIDENTIFIER
DECLARE @ReplyMessage xml
DECLARE @ReplyMessageName
BEGIN TRAN;
receive top(1)
@TargetDlgHandle =Conversation_handle
,@ReplyMessage = Message_Body
,@ReplyMessageName = Message_Type_Name
from newUserQueue;
if @ReplyMessageName = '//goodType'
begin
exec callwebservice 'http://path/to/my/webservice'
end
commit tran;
end
--declare queue
create queue myQueue
with ACTIVATION (
PROCEDURE_NAME = handleNewMessageInQueue,
MAX_QUEUE_READERS =100,
EXECUTE AS owner
);
但这一次,没有发送请求。我检查并意识到该sp_OACreate
方法不会创建对象,因为它的值@Object
是null
在执行它之后。此外,当我打电话sp_OAGetErrorInfo
获取错误信息时,一切都是null
我正在使用 SQL Server 2016
如果您能在这里找到问题,我将不胜感激。
编辑
我发现如果我启用TRUSTWORTHY
该数据库一切正常。但启用它 可以打开安全漏洞。
有没有更好的方法来做到这一点?