none
テーブルへの直接参照不可で指定されたストアドプロシージャからなら参照可能にするには RRS feed

  • 質問

  • お世話になります。

    質問する環境はSQL Server 2012ですが、バージョンはあまり関係しないと思います。

    新しく作成するAユーザーには、存在する各DBと各テーブルの一覧取得を不可能にし、さらに直接レコードを取得できない用にしたいのですが、特定テーブルからのレコード取得に関しては、Bと言うストアドプロシージャを使えばレコード取得可能と言うようにしたいと考えています。

    どのような方法で実現できるのかわかりません。

    Bと言うストアドプロシージャ内でユーザーなどを変更する方法とかがわかれば実現できる気もしますが・・・

    どのようにすれば実現できるか教えてください。

    2018年7月9日 5:46

回答

  • 私がご紹介したページに、ログインしているユーザーにIMPERSONATE権限が必要であると書かれていますが、設定されていますでしょうか?

    --- 引用開始 ---------------------

    GRANT IMPERSONATE ON USER:: user2 TO user1;

    --- 引用終了 ---------------------


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク miniHORI 2018年8月15日 1:00
    2018年7月10日 8:33
  • miniHORIさん

    https://docs.microsoft.com/ja-jp/sql/t-sql/statements/grant-object-permissions-transact-sql?view=sql-server-2017

    このURLの「B. ストアド プロシージャの EXECUTE 権限を許可する」

    という箇所で実現できる気がするのですがいかがでしょうか?

    • 回答としてマーク miniHORI 2018年8月15日 1:01
    2018年7月9日 8:15

すべての返信

  • miniHORIさん

    https://docs.microsoft.com/ja-jp/sql/t-sql/statements/grant-object-permissions-transact-sql?view=sql-server-2017

    このURLの「B. ストアド プロシージャの EXECUTE 権限を許可する」

    という箇所で実現できる気がするのですがいかがでしょうか?

    • 回答としてマーク miniHORI 2018年8月15日 1:01
    2018年7月9日 8:15
  • miniHORIさん

    https://docs.microsoft.com/ja-jp/sql/t-sql/statements/grant-object-permissions-transact-sql?view=sql-server-2017

    このURLの「B. ストアド プロシージャの EXECUTE 権限を許可する」

    という箇所で実現できる気がするのですがいかがでしょうか?

    ご回答ありがとうございます。ただ・・・

    テーブルに対して直接SELECTを許可したくないため、テーブルに対するSELECT権限を外すとストアドプロシージャの実行時に権限エラーとなります。何にどんな権限を与えればよいのでしょうか?

    引き続き、ご協力をお願い致します。

    2018年7月9日 11:16
  • Bと言うストアドプロシージャ内でユーザーなどを変更する方法とかがわかれば実現できる気もしますが・・・

    これであれば、Execute as句が使えます。

    EXECUTE AS (Transact-SQL)
    https://msdn.microsoft.com/ja-jp/library/ms181362(v=sql.120).aspx


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年7月10日 4:59
  • Bと言うストアドプロシージャ内でユーザーなどを変更する方法とかがわかれば実現できる気もしますが・・・

    これであれば、Execute as句が使えます。

    EXECUTE AS (Transact-SQL)
    https://msdn.microsoft.com/ja-jp/library/ms181362(v=sql.120).aspx


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!


    ご回答ありがとうございます。

    EXECUTE AS LOGIN = 'TESTUser';

    と言う命令を組み込んでみた結果、下記エラーが発生しました。

    ---------

    メッセージ 15406、レベル 16、状態 1、行 8
    サーバー プリンシパルとして実行できません。プリンシパル "TESTUser" が存在しないか、この種類のプリンシパルで権限を借用できないか、ユーザーに権限がありません。

    ---------

    ストアドプロシージャを実行するユーザーにsysadminの権限を与える必要があるのでしょうか?

    ストアドプロシージャを実行するユーザーに制限掛けるために行なうのに、sysadmin を与えるのは避けたいのですが・・・

    何かよい方法はないでしょうか?


    • 編集済み miniHORI 2018年7月10日 8:24
    2018年7月10日 8:23
  • 私がご紹介したページに、ログインしているユーザーにIMPERSONATE権限が必要であると書かれていますが、設定されていますでしょうか?

    --- 引用開始 ---------------------

    GRANT IMPERSONATE ON USER:: user2 TO user1;

    --- 引用終了 ---------------------


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 回答としてマーク miniHORI 2018年8月15日 1:00
    2018年7月10日 8:33
  • お世話になります。

    本件、返信を頂いた内容でドキュメントを読み直し、やっと理解でき、解決しました。

    ご協力、ありがとうございます。

    2018年8月15日 1:00