"Service Broker"サーバープリンシパル "SA"は、現在のセキュリティコンテキストの下でデータベースにアクセスできません。
-
21-12-2019 - |
質問
私は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
. 所属していません StackOverflow