我正在尝试将数据写入MS SQL数据库的FILESTREAM列。在本地计算机上运行它时,它可以正常工作,但是一旦连接到远程计算机,它就会锁定。
这是我所做的(使用NHibernate(:
private static readonly string QUERY_GET_PATH =
"select CompressedData.PathName() as path, GET_FILESTREAM_TRANSACTION_CONTEXT() as con from Data.TimeSeries where FS_ID = :dataId";
private static readonly string QUERY_SET_BLANK =
"update Data.TimeSeries set CompressedData = Cast('' as varbinary(max)) where FS_ID = :dataId";
// ...
ISession session = ...
var q1 = session.CreateSQLQuery(QUERY_SET_BLANK);
q1.SetGuid("dataId", ts.DataId);
q1.ExecuteUpdate();
var q2 = session.CreateSQLQuery(QUERY_GET_PATH);
q2.SetGuid("dataId", ts.DataId);
var results = q2.List();
var item = (object[])results[0];
var path = (string)item[0];
var context = (byte[])item[1];
return new SqlFileStream(path, context, FileAccess.Write);
在本地运行这个可以正常工作,但是然后我使用如下连接字符串连接到远程数据库(这不在我手中,我只需要写入它(:
Server=10.0.0.5; Database=TheDatabase; User Id=foo; Password='barfoo';
返回的路径如下所示:
\SOME-HOSTSOMEWHEREv02-A60EC2F8-2B24-11DF-9CC3-AF2E56D89593FooDataTimeSeries%!CompressedDataBAD566ED-CD86-42DE-AC71-D13125E89990VolumeHint-HarddiskVolume1
首先,我认为这是因为从10.0.0.5
到SOME-HOST
的名称解析,但是在向我的hosts
文件添加适当的条目时,它会一直锁定(ping到数据库有效(。
可能出了什么问题?
随访
等待几分钟后,我收到一条Win32Exception
,其中包含消息The user name or password is incorrect
。
我将其作为答案发布,以便我可以将其标记为已解决,尽管它更像是一种解决方法 - 但我想至少在这里为可能面临相同或类似问题的其他人留下解释。
正如我所发现的,FILESTREAM 仅适用于 SSPI,而 SSPI 仅在客户端和服务器位于同一域中或在本地访问数据库时才有效。这就解释了为什么当我在本地访问数据库时它首先起作用。
由于数据库服务器位于由与我们合作的第三方设置的系统中,因此我无法将客户端计算机放入其域,也无法将他们的服务器放入我们的域。我们的解决方法是准备所有内容,将其压缩,将该存档传输到数据库服务器,并在那里运行一个服务,本地连接到数据库,将所有内容放入其中。从安全的角度来看,这没关系,因为两个系统都只能在本地网络中运行,无法访问外部。