web-dev-qa-db-ja.com

別のログインを使用して同じサーバー上の別のデータベースでストアドプロシージャを実行する方法

2つのデータベース( [〜#〜] a [〜#〜] [〜#〜] b [〜#〜] )同じサーバー上。データベースAにはユーザー ua が定義されており、データベースBにはユーザー ub が定義されています。

[〜#〜] a [〜#〜] にストアドプロシージャがあり、 ua として実行されています。 [〜#〜] b [〜#〜] の手順、 ub として実行(これはアクセス権を持つ唯一のユーザーです)。

これまで、 [〜#〜] a [〜#〜] [〜#〜] b [〜#〜] が見つかりました別のサーバー上で、リンクサーバーを使用してログインを切り替えました。しかし、 [〜#〜] a [〜#〜] でストアドプロシージャを実行すると、次のエラーが発生します: "トランザクションコンテキストが使用中別のセッションで」

このエラーをグーグルで調べたところ、これは設計上のものであり、Microsoftの article に基づいていることがわかりました。ループバックリンクサーバーは分散トランザクションでは使用できないことを示しています。

[〜#〜] a [〜#〜] にストアドプロシージャを作成し、 ua として実行する他の方法はありますか?ストアドプロシージャを [〜#〜] b [〜#〜] として ub として実行します(両方のデータベースが同じサーバー上にある場合) ?

どうもありがとう!
アレックス

1
Alex Pulver

uaがログインlaに関連付けられ、ublbに関連付けられていると仮定します。

これを機能させるには、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して、プロシージャを直接呼び出せるようにすることです。

1
Sebastian Meine