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で何かが変更された場合はどうなりますか?
sys.dm_exec_connections
-KerberosこれがGPO=がgpresult.exe /R
を介してMSSQL1に適用されたことを確認できます。その後、SQLノードとファイルサーバーノードの両方を再起動して、キャッシュが確実にフラッシュされたことを確認します。
あなたの設定はしっかりしているように見えます。 SPNと委任は、自分で行った場合と同じように構成されています。
あなたが説明していない唯一のものは、ファイル/共有許可です。これが私の解決策です。
セキュリティアカウントの委任(偽装)
ユーザーがSQL Serverログインを使用する場合、SQL Serverプロセスアカウントのセキュリティプロファイルが使用されます。 SQL Server認証を使用したログインは、データベースエンジンの外部では認証できません。そのため、SQL Server認証を使用したログインによってBULK INSERTコマンドが開始されると、SQL Serverプロセスアカウントのセキュリティコンテキストを使用してデータへの接続が作成されます。サーバーデータベースエンジンサービス)。ソースデータを正常に読み取るには、SQL Serverデータベースエンジンで使用されるアカウント、ソースへのアクセスを許可する必要がありますデータ対照的に、SQL ServerユーザーがWindows認証を使用してログオンした場合、ユーザーはユーザーアカウントがアクセスできるファイルのみを読み取ることができます、SQL Serverプロセスのセキュリティプロファイルに関係なく。
リファレンス: BULK INSERT(Transact-SQL)
委任に関する私の経験では、SQL Serverサービスアカウントには、ユーザーに代わってアクセスしようとしている共有への適切なアクセス許可が必要です。これらの権限を調整しましたか?事前に読み取り専用で十分だと思います。