2つのデータベース( [〜#〜] a [〜#〜] と [〜#〜] b [〜#〜] )同じサーバー上。データベースAにはユーザー ua が定義されており、データベースBにはユーザー ub が定義されています。
[〜#〜] a [〜#〜] にストアドプロシージャがあり、 ua として実行されています。 [〜#〜] b [〜#〜] の手順、 ub として実行(これはアクセス権を持つ唯一のユーザーです)。
これまで、 [〜#〜] a [〜#〜] と [〜#〜] b [〜#〜] が見つかりました別のサーバー上で、リンクサーバーを使用してログインを切り替えました。しかし、 [〜#〜] a [〜#〜] でストアドプロシージャを実行すると、次のエラーが発生します: "トランザクションコンテキストが使用中別のセッションで」。
このエラーをグーグルで調べたところ、これは設計上のものであり、Microsoftの article に基づいていることがわかりました。ループバックリンクサーバーは分散トランザクションでは使用できないことを示しています。
[〜#〜] a [〜#〜] にストアドプロシージャを作成し、 ua として実行する他の方法はありますか?ストアドプロシージャを [〜#〜] b [〜#〜] として ub として実行します(両方のデータベースが同じサーバー上にある場合) ?
どうもありがとう!
アレックス
ua
がログインla
に関連付けられ、ub
がlb
に関連付けられていると仮定します。
これを機能させるには、lb
の偽装をla
に許可します。次に、次のようにb.dbo.someprocのラッパーを作成できます。
CREATE PROCEDURE dbo.b_someproc
AS
BEGIN
EXECUTE AS LOGIN='lb';
EXEC b.dbo.someproc;
REVERT;
END;
ただし、なりすましは非常に広範囲な許可であり、おそらく付与したくないものです。これを回避するには、ユーザーub
をデータベースaに追加するか、ユーザーua
をデータベースbに追加します。
ub
をに追加すると、次のようなラッパーを作成できます。
CREATE PROCEDURE dbo.b_someproc
WITH EXECUTE AS 'ub'
AS
BEGIN
EXEC b.dbo.someproc;
END;
ただし、はるかに簡単な方法は、ua
をbにadして、プロシージャを直接呼び出せるようにすることです。