1

[dbo] スキーマのストアド プロシージャを使用して、あるスキーマの1つのテーブルからデータを選択し、ユーザーが 1 つのデータベース ロールを介してアクセスし、別のスキーマの同様の名前のテーブルからデータを選択できるかどうか、アドバイスをお願いします。別のデータベース ロールを介してアクセスするユーザーの場合は?

たとえば、データベースに 3 つのスキーマがあるとします。

  • dbo

[ RedLogin ] と [ GreenLogin ]の 2 つのデータベース ログインがあります。これらは、それぞれのデータベース ユーザー [ RedUser ] と [ GreenUser ] を使用してデータベースに接続します。これらのユーザーは、それぞれのデータベース ロール [ RedRole ] および [ GreenRole ] のメンバーです。

  • [ RedUser ] のデフォルト スキーマは [ red ] です。
  • [ GreenUser ] のデフォルト スキーマは [ green ] です。
  • [ RedRole ] は [ dbo ]に対する実行権限と[ red ] スキーマに対する選択権限を持っています。
  • [ GreenRole ] は [ dbo ]に対する実行権限と[ green ] スキーマに対する選択権限を持っています。
  • [ green ] スキーマには、[ User ]というテーブルがあります。
  • [ red ] スキーマには [ User ]というテーブルがあります。
  • [ dbo ] スキーマには、実行される [ User_GetAll ] というストアド プロシージャがあります。

    SELECT * FROM USER;

私が欲しいのは:

  • [ Redlogin ]でログインし、[ User_GetAll ] を呼び出すユーザーは、[ red ].[ User ] テーブルからすべてのユーザーを取得します。
  • [ Greenlogin ]でログインし、[ User_GetAll ] を呼び出すユーザーは、[ green ].[ User ] テーブルからすべてのユーザーを取得します。

これは可能ですか?もしそうなら、それを達成するための最良の方法は何ですか? ありがとうございました。

注意:上記のシナリオは、私が達成しようとしていることを理解するためのものです。実際のプロジェクトには、ソリューションを適用する必要がある多くのテーブルとストアド プロシージャがあります。

4

1 に答える 1

1

SCHEMA_NAME()これは、呼び出し元の既定のスキーマを返すメソッドを使用する場合に可能になるはずです ( http://msdn.microsoft.com/en-gb/library/ms175068.aspx )

あなたの例では:

DECLARE @Sql NVARCHAR(MAX)
SET @Sql = 'SELECT * FROM ' + SCHEMA_NAME() + '.USER'
EXEC sp_executesql @Sql

アップデート:

奇妙なことに、簡単なテストを行ったところ、それを呼び出すEXEC('SELECT * FROM USER')とユーザーの既定のスキーマが使用されました。おそらく、ストアドプロシージャの内容を単一の内部にラップしてみることができますEXEC('')

例えば:

EXEC('
    SELECT * FROM USER
    SELECT * FROM USER
    SELECT * FROM USER
    SELECT * FROM USER
')
于 2014-06-26T12:22:46.957 に答える