10

これに対するバリエーションが求められています。以下のコードでローカルディレクトリを検索しても問題ありません。

EXEC MASTER.sys.xp_dirtree 'C:\', 1, 1

パスをネットワークの場所に切り替えると、結果が空になります。

EXEC MASTER.sys.xp_dirtree '\\Server\Folder', 1, 1

私は最初、それは許可に関係しているのではないかと考えました。共有ボリュームとセキュリティ グループの ACL リストに SQL Server サービスを追加しました。

私を指すためのヘルプや指示は大歓迎です。ディレクトリとサブディレクトリ内のファイルのリストを取得する別の方法でもかまいません。

【編集済】

4

1 に答える 1

8

注意すべき点は次の2つです。

  • SQL Server サービス (通常、[サービス] リストに "SQL Server (MSSQLSERVER)" として表示されるサービス) のログオン アカウントが、そのネットワーク共有に対する権限を持っていることを確認します。

    アップデート

    問題は、OP が SQL Server サービスをローカル システム アカウントとして実行していたことにありました。そのため、OP は SQL Server のドメイン アカウントを作成し、その新しいドメイン アカウントを SQL Server サービスのログオン アカウントとして割り当て、そのドメイン アカウントに適切な NTFS アクセス許可を付与しました。

    これは、SQL Server が実行されているサーバー自体を NTFS 権限に追加することで、SQL サービスをローカル システム アカウントとして実行したままにしておくことで修正できる可能性があることに注意してください。これは通常、サーバー名の後にドル記号 ($) を指定することで可能になります。例: MySqlServer01$. もちろん、これにより、そのサーバー上でローカル システム アカウントとして実行されているすべてのサービスにその NTFS アクセス許可が与えられますが、これは望ましくない場合があります。したがって、SQL Server サービスを実行するためのドメイン アカウントを作成することをお勧めします (これは、どのような場合でも良い方法です!)。

    これは完了しているように見えるので、Windows にそのアカウントで直接ログオンし、その特定のネットワーク パスにアクセスしてテストする必要があります。

  • 実行中の SQL Server のログインにxp_dirtree「sysadmin」権限があることを確認します。

    • sysadminこれは、サーバーの役割にアカウントを追加することによって直接行うことができます。

    • 実行するストアド プロシージャに署名しますxp_dirtree

      • [マスター] に証明書を作成する
      • その証明書に基づいてログインを作成します
      • sysadminサーバーの役割に証明書ベースのログインを追加する
      • 証明書をバックアップする
      • 実行するストアド プロシージャが存在する、または存在する予定のデータベースに証明書を復元します。xp_dirtree
      • ADD SIGNATUREと復元したばかりの証明書をxp_dirtree使用して、実行するストアド プロシージャに署名します。
      • そのストアド プロシージャの GRANT EXECUTE を、これを実行する必要があるユーザーやロールに付与します。

述べておくと、別のオプションは、xp_dirtree完全に廃止し、代わりに SQLCLR を使用することです。おそらく、さまざまなブログにサンプルの C# コードがあります。また、ファイル システム機能を備えたいくつかの CodePlex プロジェクトもあり、コンパイルを処理したくないプロジェクトのためにコンパイル済みのアセンブリを提供する場合もあります。また、 TVF を含むいくつかのファイルシステム関数を持つSQL#ライブラリもありますFile_GetDirectoryListing(つまり、最初にすべての列とすべての行を一時テーブルにダンプする必要はなく、WHERE 条件を使用して SELECT ステートメントで使用できます)。 . また、完全にストリーミングされるため、100k 以上のファイルでも非常に高速です。注意してくださいFILE_*関数は完全版のみ (つまり無料ではない) であり、私は SQL# の作成者ですが、この状況を非常にうまく処理します。

于 2014-11-05T19:57:01.747 に答える