私は今でも、CLR プロシージャが最善の策であると信じています。だから、私はその答えを受け入れています。しかし、私はそれほど頭が良くないか、実装が非常に困難です。Mircosoft によれば、64 ビット SQL Server 2005 インスタンスから iSeries リンク サーバーを動作させる唯一の方法であるため、SQL Server サービスはローカル アカウントで実行されています。ドメイン アカウントで実行するように SQL Server サービスを変更すると、ネットワーク上にあるファイルに対して xp_fileexist コマンドが正常に機能します。
この CLR ストアド プロシージャを作成し、アクセス許可レベルを [外部] に設定してビルドし、署名しました。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Security.Principal;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void FileExists(SqlString fileName, out SqlInt32 returnValue)
{
WindowsImpersonationContext originalContext = null;
try
{
WindowsIdentity callerIdentity = SqlContext.WindowsIdentity;
originalContext = callerIdentity.Impersonate();
if (System.IO.File.Exists(Convert.ToString(fileName)))
{
returnValue = 1;
}
else
{
returnValue = 0;
}
}
catch (Exception)
{
returnValue = -1;
}
finally
{
if (originalContext != null)
{
originalContext.Undo();
}
}
}
}
次に、次の TSQL コマンドを実行しました。
USE master
GO
CREATE ASYMMETRIC KEY FileUtilitiesKey FROM EXECUTABLE FILE = 'J:\FileUtilities.dll'
CREATE LOGIN CLRLogin FROM ASYMMETRIC KEY FileUtilitiesKey
GRANT EXTERNAL ACCESS ASSEMBLY TO CLRLogin
ALTER DATABASE database SET TRUSTWORTHY ON;
次に、CLR ストアド プロシージャを Visual Studio からターゲット データベースにデプロイし、この TSQL を使用して、Windows 認証でログインした SSMS から実行しました。
DECLARE @i INT
--EXEC FileExists '\\\\server\\share\\folder\\file.dat', @i OUT
EXEC FileExists 'j:\\file.dat', @i OUT
SELECT @i
ローカル ファイルとネットワーク ファイルのどちらを試しても、常に 0 になります。後でもう一度試すかもしれませんが、今のところ、別の道をたどってみます。誰かが光を当てることができれば、それは大歓迎です。