尝试使用 SqlFileStream 访问 FILESTREAM 列会导致锁定
Trying to access a FILESTREAM column with SqlFileStream causes a lock-up
我正在尝试将数据写入 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-HOST\SOMEWHERE\v02-A60EC2F8-2B24-11DF-9CC3-AF2E56D89593\Foo\Data\TimeSeries\%!CompressedData\BAD566ED-CD86-42DE-AC71-D13125E89990\VolumeHint-HarddiskVolume1
首先我认为这是因为从 10.0.0.5
到 SOME-HOST
的名称解析,但在向我的 hosts
文件添加适当的条目时它一直锁定(ping 数据库有效).
可能出了什么问题?
跟进
等待几分钟后,我收到 Win32Exception
消息 The user name or password is incorrect
。
我将此作为答案发布,因此我可以将其标记为已解决,尽管它更像是一种解决方法 - 但我想至少在这里为可能面临相同或类似问题的其他人留下解释.
据我所知,FILESTREAM 仅适用于 SSPI,而 SSPI 仅在客户端和服务器位于同一域中或在本地访问数据库时才有效。这解释了为什么当我在本地访问数据库时它首先起作用。
由于数据库服务器在与我们合作的第三方建立的系统中,我无法将我的客户端计算机放入他们的域中,也无法将他们的服务器放入我们的域中。我们的解决方法是准备好所有内容,将其压缩,将该存档传输到数据库服务器并在那里提供服务 运行ning,在本地连接到数据库,将所有内容放入。从安全的角度来看,这是可以的,因为两者系统仅 运行 在本地网络中,无法访问外部。
我正在尝试将数据写入 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-HOST\SOMEWHERE\v02-A60EC2F8-2B24-11DF-9CC3-AF2E56D89593\Foo\Data\TimeSeries\%!CompressedData\BAD566ED-CD86-42DE-AC71-D13125E89990\VolumeHint-HarddiskVolume1
首先我认为这是因为从 10.0.0.5
到 SOME-HOST
的名称解析,但在向我的 hosts
文件添加适当的条目时它一直锁定(ping 数据库有效).
可能出了什么问题?
跟进
等待几分钟后,我收到 Win32Exception
消息 The user name or password is incorrect
。
我将此作为答案发布,因此我可以将其标记为已解决,尽管它更像是一种解决方法 - 但我想至少在这里为可能面临相同或类似问题的其他人留下解释.
据我所知,FILESTREAM 仅适用于 SSPI,而 SSPI 仅在客户端和服务器位于同一域中或在本地访问数据库时才有效。这解释了为什么当我在本地访问数据库时它首先起作用。
由于数据库服务器在与我们合作的第三方建立的系统中,我无法将我的客户端计算机放入他们的域中,也无法将他们的服务器放入我们的域中。我们的解决方法是准备好所有内容,将其压缩,将该存档传输到数据库服务器并在那里提供服务 运行ning,在本地连接到数据库,将所有内容放入。从安全的角度来看,这是可以的,因为两者系统仅 运行 在本地网络中,无法访问外部。