1

我想在将行插入表时调用 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方法不会创建对象,因为它的值@Objectnull在执行它之后。此外,当我打电话sp_OAGetErrorInfo获取错误信息时,一切都是null

我正在使用 SQL Server 2016

如果您能在这里找到问题,我将不胜感激。

编辑

我发现如果我启用TRUSTWORTHY该数据库一切正常。但启用它 可以打开安全漏洞

有没有更好的方法来做到这一点?

4

0 回答 0