一括挿入の制約のない委任を構成する


12

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

メッセージ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サービスはユーザーアカウントを偽装できず、匿名ユーザーとしてファイルサーバーに接続しようとします。

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

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

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

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

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


1
二つの質問:1)あなたは?委任のためのあなたの個人的なWindowsドメインアカウントを有効にしてみました2)あなたはSSMS経由でSQL Serverに接続するとき、あなたはSQL Serverが上で実行して、ローカルに接続されていることをサーバー(つまり、リモートデスクトップ)にログオンしています、またはワークステーションにログオンし、SQL Serverにリモートで接続しますか?サーバーに直接ログオンしてSSMS経由でローカルに接続しようとしたことがない場合は、それを試してください。ドメインアカウントの委任を有効にしていない場合は、試してください。
ソロモンラッツキー

回答:


1

構成はしっかりしています。SPNと委任は、私が自分で行ったように構成されます。

あなたが説明していない唯一のものは、ファイル/共有の許可です。これが私のソリューションが介入する場所です。

解決策1(個人アカウント)

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

解決策2(SQL Serverサービスアカウント)

  1. SQL Serverサービスアカウントがファイルサーバーの共有上のファイルにアクセスできることを 確認します
    • SQL Serverのサービスの共有アクセス許可レベルまたはあなたは、誰もがREAD権限を持っていることを表示される場合がありますほとんどの場合、少なくとも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. 一括挿入でインポートを実行する

一括挿入のアクセス許可

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

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

参照:BULK INSERT(Transact-SQL)


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.