web-dev-qa-db-ja.com

BULK INSERTの制約のない委任を構成する

Always On可用性グループにMicrosoft SQL Server 2016ノードのペアがあります。 Windows Server 2016ファイルサーバーフェールオーバークラスターにあるファイルに対して(SQL Server 2016 Management Studioクエリを使用して)BULK INSERTを実行しようとしていますが、次のエラーが発生します。

メッセージ4861、レベル16、状態1
ファイル「\ nas2.my.domain\Microsoft SQL Server 2016 Enterprise\test.txt」を開けなかったため、一括読み込みできませんオペレーティングシステムエラーコード5(アクセスが拒否されました)。

これは、アクティブノード名(nas2.my.domain)またはフェールオーバークラスターリスナー(nas.my.domain)を使用しているかどうかに関係なく発生します。

調べてみたところ、SQL ServerがBULK INSERTのニュアンスが原因で、接続しているユーザーアカウントを偽装できないことが原因であることがわかりました。

Windows認証を使用してSQL Serverに接続する場合、SQL Serverサービスアカウントは、ファイルサーバーに接続するときにユーザーアカウントを偽装しようとします。 SQL Server認証を使用して接続する場合、SQL Serverサービスアカウントとしてファイルサーバーに接続します。

委任と偽装が適切に構成されていない場合(既定の状態)、SQL Serverサービスはユーザーアカウントを偽装することができず、匿名ユーザーとしてファイルサーバーに接続しようとします。

これは、ファイルサーバーのセキュリティイベントログを調べることで確認できます。これらの事実は、制約なしおよび制約付き委任の構成に関するガイドとともに、次のリンクに記載されています。

thesqldudeのガイドの指示に従ってみましたが、まだ機能しません。

私がBULK INSERTに接続しようとしているデータベースは、可用性グループの一部ではないため、MSSQL1ノードのみが関連しているはずです。ファイルサーバーはNAS2ノードでアクティブでした。ファイルサーバーのイベントログを確認しても、この問題が依然として発生しており、SQL Serverはユーザーアカウントを偽装するのではなく、匿名ユーザーとしてファイルサーバーを認証しようとしています。

誰が何が悪いのか知っていますか?または、これらのガイドを廃止するためにSQL Server 2016で何かが変更された場合はどうなりますか?

これがGPO=がgpresult.exe /Rを介してMSSQL1に適用されたことを確認できます。その後、SQLノードとファイルサーバーノードの両方を再起動して、キャッシュが確実にフラッシュされたことを確認します。

12
Muh Fugen

あなたの設定はしっかりしているように見えます。 SPNと委任は、自分で行った場合と同じように構成されています。

あなたが説明していない唯一のものは、ファイル/共有許可です。これが私の解決策です。

ソリューション1(個人アカウント)

  1. 個人のアカウントがファイルサーバーの共有上のファイルへのアクセスを許可されていることを確認します
    • 個人のアカウントには、共有アクセス許可レベルで少なくともREAD権限が必要です。ほとんどの場合、EVERYONEにREAD権限があることがわかります。
    • 個人のアカウントには、ファイルの権限レベルで少なくとも読み取り権限が必要です
    • その1つのファイルのファイルレベルでの権限の継承を確認してください
      • ファイルのアクセス許可を変更した後、SQL Serverを再起動するか、SQL Serverサービスを循環させます。
    • または:your personalアカウントでSQL Serverにログインし、共有に接続してファイルを開きます。
  2. 個人のアカウントでSSMSを開きます。
  3. Windows認証を使用してSQL Serverインスタンスへの接続を開きます。
    • 以前に使用したスクリプトを含むSQL Serverサービスアカウントでインスタンスに接続していることを確認します。
  4. BULK INSERTを使用してインポートを実行する

ソリューション2(SQL Serverサービスアカウント)

  1. SQL Serverサービスアカウントがファイルサーバーの共有上のファイルへのアクセスを許可されていることを確認します
    • SQL Serverサービスアカウントには、少なくとも共有アクセス許可レベルでのREAD権限が必要です。ほとんどの場合、EVERYONEにREAD権限があることがわかります。
    • SQL Serverサービスアカウントには、ファイルの権限レベルで少なくともREAD権限が必要です
    • その1つのファイルのファイルレベルでの権限の継承を確認してください
      • ファイルのアクセス許可を変更した後、SQL Serverを再起動するか、SQL Serverサービスを循環させます。
    • または、SQL Serverサービスアカウントを使用してSQL Serverにログインし、共有に接続してファイルを開きます。
  2. SQL ServerサービスアカウントでSSMSを開きます。
    • Runas:your_domain\SQL_Server_service_account
    • パスワードを入力してください
  3. Windows認証を使用してSQL Serverへの接続を開きます。
    • 以前に使用したスクリプトを含むSQL Serverサービスアカウントでインスタンスに接続していることを確認します。
  4. BULK INSERTを使用してインポートを実行する

一括挿入権限

セキュリティアカウントの委任(偽装)

ユーザーがSQL Serverログインを使用する場合、SQL Serverプロセスアカウントのセキュリティプロファイルが使用されます。 SQL Server認証を使用したログインは、データベースエンジンの外部では認証できません。そのため、SQL Server認証を使用したログインによってBULK INSERTコマンドが開始されると、SQL Serverプロセスアカウントのセキュリティコンテキストを使用してデータへの接続が作成されます。サーバーデータベースエンジンサービス)。ソースデータを正常に読み取るには、SQL Serverデータベースエンジンで使用されるアカウント、ソースへのアクセスを許可する必要がありますデータ対照的に、SQL ServerユーザーがWindows認証を使用してログオンした場合、ユーザーはユーザーアカウントがアクセスできるファイルのみを読み取ることができます、SQL Serverプロセスのセキュリティプロファイルに関係なく。

リファレンス: BULK INSERT(Transact-SQL)

1

委任に関する私の経験では、SQL Serverサービスアカウントには、ユーザーに代わってアクセスしようとしている共有への適切なアクセス許可が必要です。これらの権限を調整しましたか?事前に読み取り専用で十分だと思います。

0
Chris Lumnah