0

Windows Server 2008 R2 x64 SP1、Sql Server 2008 x64 SP3、Access データベース エンジン x64 SP1

リンクサーバーがあります:

EXEC master.dbo.sp_addlinkedserver @server = N'dbf2', @srvproduct=N'dbf2', @provider=N'MSDASQL', @provstr=N'DRIVER={Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)};'

ローカル ディスクから dbf ファイルをクエリすると、すべて問題ありません。

select * from openquery(dbf2, 'select * from c:\\V4C8MA6.dbf') a

ただし、ネットワーク共有からクエリを実行する場合

select * from openquery(dbf2, 'select * from \\\\gefest\\upload\\V4C8MA6.dbf') a

エラーが発生しました:

Msg 7399, Level 16, State 1, Line 6
The OLE DB provider "MSDASQL" for linked server "dbf2" reported an error. The provider did not give any information about the error.
Msg 7350, Level 16, State 2, Line 6
Cannot get the column information from OLE DB provider "MSDASQL" for linked server "dbf2".

パスを記述するためにさまざまなバリエーションを試しました: []、""、``、\"\"、....ネットワーク共有アクセスですべて問題ありません。SQL サーバー アカウントにはアクセス権が必要です。しかし...

それを機能させる方法は?

2012 年 5 月 4 日に追加:

xp_cmdchell は、ディレクトリを完全に一覧表示します。

これは私が発見したものです: ファイルの場所を示す sprovstr を使用してリンクサーバーを作成しました:

@provstr=N'DRIVER={Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)};dbq=\\gefest\upload'

これは、sql server authを使用して sql サーバーに接続すると機能します。

これは、 dbqを使用したときに ProcMon が表示するものです。

日付と時刻: 2012 年 5 月 4 日 9:57:55 AM
イベント クラス: ファイル システム
操作: CreateFile
結果:成功 パス: \\gefest\upload\ TID : 8588 期間: 0.0001988 必要なアクセス: 属性の読み取り 配置: 開く オプション: Open Reparse Point Attributes: n/a ShareMode: Read、Write、Delete AllocationSize: n/a OpenResult: Opened









これは、クエリでパスを指定する場合です:


日付と時刻: 2012 年 5 月 4 日 9:58:53 AM
イベント クラス: ファイル システム
操作: CreateFile
結果: OBJECT PATH INVALID
パス: \\gefest\upload\
TID:
8588 期間: 0.0000819 目的の
アクセス: 属性の読み取り
処理: 開く
オプション: リパース ポイントを開く
属性:
なし 共有モード: 読み取り、書き込み、削除
AllocationSize:なし

SQL Server が最初のクエリで共有への必要なアクセスを受け取り、2 番目のクエリでは受け取らないのはなぜですか?

3 番目と 4 番目のバリアントは、Windows authを使用してサーバーに接続する場合です。

dbqを使用:


日付と時刻: 2012 年 5 月 4 日 10:02:54 AM
イベント クラス: ファイル システム
操作: CreateFile
結果:アクセスが拒否されました
パス: \\gefest\upload\
TID:
8588 期間: 0.0031837 必要な
アクセス: 属性の読み取り 配置:オプションを
開く
: Open For Backup、Open Reparse Point
属性:
なし ShareMode: 読み取り、書き込み、削除
AllocationSize:
なし 偽装: GAZ\kozlovai

クエリでパスを示す:


日時: 2012 年 5 月 4 日 10:02:20 AM
イベント クラス: ファイル システム
操作: CreateFile
結果: OBJECT PATH INVALID
パス: \\gefest\upload\
TID: 8588
期間: 0.0000378 必要な
アクセス: 属性の読み取り
処理: 開く
オプション: Open For Backup、Open Reparse Point
属性:
なし ShareMode: 読み取り、書き込み、削除
AllocationSize:
なし 偽装: GAZ\kozlovai

共有に接続するときに、SQL サーバーが偽装します。そして、このアカウント 'GAZ\kozlovai' は共有への完全なアクセス権を持っていますが、SQL サーバーはまだファイルを開くことができません...

4

1 に答える 1

0

クエリを実行するユーザー ID に、サーバー上の一時フォルダーへの読み取りおよび書き込みアクセス権があるかどうかを確認します。これは、SQL Server プロセス アカウントではなく、呼び出し元のユーザーのコンテキストで SQL Server がクエリの一時ファイルを作成するためです。

編集: UNC ホスト共有を介してのみ発生するこの問題の少なくともいくつかのインスタンスを思い出すので、ローカル参照で発生するリードパイプの簡単な問題ではありません。

念のため、XP_CMDSHELL を起動して 'DIR \\SERVER\SHARE\FOLDER' を実行し、SQL Server 内の UNC 経由でそのパスと通信できることを確認してください。そうでない場合でも、克服すべきアクセスの問題があります。

最後に、他のすべてが失敗し、サーバーへのログイン アクセス権がある場合は、Process Monitor のコピーを起動し、そのクエリが起動したときにネットワーク IO の問題を監視します。

于 2012-05-02T23:47:20.067 に答える