"服务代理"服务器主体"sa"无法在当前安全上下文下访问数据库

Van*_*nel 1 t-sql sql-server stored-procedures service-broker sql-server-2012-express

我正在使用SQL Server 2012 Express.

我正在使用Service Broker异步运行存储过程.

激活过程必须访问另一个数据库以执行另一个存储过程.这是代码:

CREATE PROCEDURE [dbo].[GetNewCodes]
    @gintNewCodes bigint,   
    @presNewCodes tinyint,
    @levelNewCodes bigint,
    @quantityNewCodes smallint
AS

    -- Get new codes from INCIC database.
    DECLARE @return_value int,
            @xmlGenerated xml,
            @xmlString NVARCHAR(MAX)

    SET NOCOUNT ON;

        -- Set that this stored procedure is running
        update dbo.RunningSPs with (serializable) set conf_value = 1
        where sp_name = N'GetNewCodes'

        if @@rowcount = 0
        begin
            insert dbo.RunningSPs(sp_name, conf_value) values (N'GetNewCodes', 1)
        end

    EXEC    @return_value = [INCIC].[dbo].[ReadCodeBuffer]
            @gint = @gintNewCodes,
            @pres = @presNewCodes,
            @level = @levelNewCodes,
            @quantity = @quantityNewCodes,
            @xmlGenerated = @xmlGenerated OUTPUT

    SET @xmlString = cast(@xmlGenerated as nvarchar(max))

    -- Process these new codes on TRZ.
    EXEC dbo.ProcessCodes @XmlString = @xmlString

    -- Update that we are not running this procedure any more.
    update dbo.RunningSPs with (serializable) set conf_value = 0
    where sp_name = N'GetNewCodes'

    if @@rowcount = 0
    begin
        insert dbo.RunningSPs(sp_name, conf_value) values (N'GetNewCodes', 0)
    end
Run Code Online (Sandbox Code Playgroud)

问题出在这里:[INCIC].[dbo].[ReadCodeBuffer],错误信息是:

错误:50000过程中的
不可恢复错误GetNewCodes:916:服务器主体"sa"无法访问当前安全上下文下的数据库"INCIC".

我已按照本教程实现Service,队列和激活存储过程.

我该如何解决这个问题?

Rem*_*anu 5

读取从激活的过程调用另一个数据库中的过程.

问题是激活的过程在EXECUTE AS USER上下文中运行,因此受到数据库模拟限制(它们在数据库中沙箱化).所有这些都在使用EXECUTE AS扩展数据库模拟中进行了解释.

解决方案是签署激活的过程并创建从目标数据库中的签名证书派生的用户,并为此派生用户授予所需的权限.第一个链接显示了一个完整的示例.