web-dev-qa-db-ja.com

SELECT権限により、データをExcelにインポートしようとして拒否されました

最近、プログラムの新しいバージョンに移行し、そのデータベースをSQL Server 2000からSQL Server 2008 R2に移行しました。データをプルするためにいくつかのカスタムクエリを実行するいくつかのExcelファイルがありました。 2008 R2のセットアップを反映するように接続文字列の値を変更しました。

DRIVER={SQL Server};SERVER=SQL01;UID=PSI;Trusted_Connection=Yes;DATABASE=PSI_DB_A;

Excelで更新しようとすると、エラーが発生します。

SELECT権限は、オブジェクト「ARTRNTRX」、データベース「PSI_DB_A」、スキーマ「dbo」で拒否されました。

投稿する前に、このサイトとウェブ上の多くの場所でこのエラーを調査しました。提案されたもののいくつかを試してみました。

唯一の違いは、SQL Server 2000では、ユーザー "sa"がすべてのデータベースにアクセスできることです。 2008 R2ではそれを避けたかったのです。そこで、PSIユーザーを作成し、それに制限付きのアクセス権を付与したいと考えました。とにかく、これらのいくつかのExcelシートでSELECTクエリを実行するだけです。

SSMSを使用して、[セキュリティ]> [ログイン]> [PSI]> [プロパティ]> [ユーザーマッピング]> [PSI]ユーザーにPSI_DB_Aの「db_datareader」ロールを付与しました。次に、[データベース]> [PSI_DB_Aデータベース]> [プロパティ]> [権限]> [PSIユーザー]を選択し、リストに「接続」および「選択」権限を付与します。

しかし、Excelでデータを更新しようとすると、まだSELECT権限エラーが発生します。私はここで途方に暮れています。

編集:

さらに掘り下げた後、Excelで他のソースから> SQL Serverから>サーバー名を入力>リストからデータベースPSI_DB_Aを選択してSQL Serverに接続できると、ビューとテーブルが表示されることに気付きました。ただし、一部のテーブルのみが表示され、すべてが表示されるわけではありません。

SSMSに戻り、データベースの下のテーブルリストを展開し、テーブル(Excelに表示されていたテーブルの1つ)を右クリックし、[プロパティ]> [権限]をクリックします。 users/rolesの下に、SELECTなどの権限が付与されたユーザー「public」が表示されます。しかし、他のテーブルの90%では、「public」はリストされていません。

データベース内のすべてのテーブルに対する完全な読み取り権限が必要なログインユーザーを定義したときに、「public」をテーブルアクセス許可レベルで追加する必要があるのはなぜですか?

4
jrob007

エラーを確認した後。テスト環境でセットアップしようとしたところ、エラーが発生しました。

Excelから接続をセットアップし、テストする特定のテーブルを選択した後、接続プロパティに移動します。

接続文字列が表示されます。クエリで確認して、接続文字列のパラメータがクエリから変更されていないか確認してください。

enter image description here

試してみて、進捗状況をお知らせください。

1
Im88

接続文字列でTrusted_Connection=Yesを指定したことが原因である可能性があります。これにより、クライアントとして現在ログインしているドメインアカウントを使用したWindows認証を使用して接続が確立され、実質的にUIDパラメーターを無視します。そのパラメーターを削除して再実行してください。接続文字列でパスワードを指定する必要がある場合がありますが、これは安全ではないため、Trusted Connectionパラメータを保持し、ユーザーのWindowsログインをドメイングループに入れ、ドメイングループに適切なオブジェクトへのSELECT権限を付与することもできます。

0
MattyZDBA