"Service Broker"サーバープリンシパル "SA"は、現在のセキュリティコンテキストの下でデータベースにアクセスできません。

StackOverflow https://stackoverflow.com//questions/23008315

質問

私はSQL Server 2012 Expressを使っています。

サービスブローカーを使用してストアドプロシージャを非同期的に実行しています。

起動手順は別のデータベースにアクセスして別のストアドプロシージャを実行する必要があります。これはコードです:

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
.

問題はここにあります:[INCIC].[dbo].[ReadCodeBuffer]、およびエラーメッセージは次のとおりです。

エラー:50000
プロシージャーgetNewコード:916:サーバープリンシパル "SA"は、現在のセキュリティコンテキストの下にあるデータベース "INCIC"にアクセスできません。

私はこれに従ったチュートリアルサービス、キュー、およびアクティベーションストアドプロシージャ。

どうすればこの問題を解決できますか?

他のヒント

Remus Rusanuの答えは明らかに決定的で正しいです。(ブローカーサービスを扱っている人は、彼の専門知識と貴重なブログを知っています。)

私はちょうど私の経験を文書化したいと思ったばかりなので、Googleがこの質問に直接この質問を検索するときに "" SA "がデータベースにアクセスできない... "

私の場合では、アクティブ化された手順の中から別のデータベースを呼び出しましたが、ストアドプロシージャではなくSQLステートメントを直接呼び出す。

もともと、データベース間コールは、署名付き証明書と偽装の使用なしでうまく機能しました。その後、シンタックスの変更後、上記のエラーメッセージを返し始めました。

署名付き証明書を必要とせずに機能したものです。

IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'MyOtherDb')
.

そしてここではセキュリティ例外を誘発したものです:

IF DB_ID(N'MyOtherDb') IS NOT NULL
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top