在网络共享上打开Firebird数据库文件

时间:2018-03-02 11:01:51

标签: delphi firebird firedac

我认为将映射的驱动器号转换为UNC路径就足以打开.GDB文件, 但是唉:

ConvertToUNCPath

根据我解析ConvertToUNCPath结果的方式,我得到不同的错误消息:

  

[firedac] [phys] [ib]不可用数据库
  [firedac] [phys] [ib]在文件“persoonlijk \ jan \ klanten.gdb”的“createfile(open)”操作期间出错i / o错误#$ D#$ A'error尝试打开文件'#$ D#$ A'the系统找不到指定的路径。

使用P:\Jan\KLANTEN.GDB的代码部分成功转换,例如\\tt2012server\persoonlijk\Jan\KLANTEN.GDB// lUNC := '\\2012server'; // Unable to complete network request to host lUNC := 'tt2012server'; //AGDBName := '\\tt2012server\persoonlijk\jan\klanten.gdb'; //AGDBName := 'tt2012server\persoonlijk\jan\klanten.gdb'; //AGDBName := '\persoonlijk\jan\klanten.gdb'; //AGDBName := 'persoonlijk\jan\klanten.gdb'; //AGDBName := '\jan\klanten.gdb'; //AGDBName := 'jan\klanten.gdb'; //AGDBName := 'p:\jan\klanten.gdb'; (original input)

当路径指向映射的驱动器号时,如何打开GDB文件?

补充:我尝试了这些硬编码的变体,它们都失败了:

\\tt2012server\persoonlijk

(P:映射到{{1}})

添加了:

对不起,我在初始文本中并不清楚:这不是关于连接到远程服务器上的数据库本身。我只是希望我的本地“数据库检查”工具能够打开GDB文件,如果有人将其放入我的网络共享中进行检查(而不是先将其复制到本地磁盘)。 只是意图使用WNetGetConnection是解决驱动器号到UNC路径(我在网上找到的一些代码)。

1 个答案:

答案 0 :(得分:3)

1。 Firebird明确拒绝尝试在非本地磁盘上打开数据库文件

Firebird是数据库服务器,因此它专注于性能和可靠性。

http://www.firebirdfaq.org/faq46/

性能意味着缓存了大量数据,缓存用于读取和缓存以供写入。

可靠性意味着Firebird必须从操作系统中获得有价值的保证:

一个。没有其他进程会修改数据库文件,而服务器有一些缓存的数据用于读取。

湾在任何时候,服务器可能希望从其缓存中将任何数据写入文件,并且保证该数据 - 在任何时刻 - 结束持久写入持久性媒体。

网络连接的磁盘使两种保修都无效,因此Firebird Server拒绝信任它们。

您可以自行决定破解Firebird配置或源文件,以删除此安全检查并打开网络共享文件,如果您确实需要这些文件而不是安全和速度。

但正确的解决方案是在磁盘确实携带数据库文件的计算机上安装Firebird服务器。

2。连接字符串不是数据库文件名

  

AGDBName := '\\tt2012server\persoonlijk\jan\klanten.gdb'

这并不意味着“本地Firebird服务器应使用tt2012server凭据连接到LOCAL_SYSTEM服务器并从persoonlijk共享资源”读取数据库文件,正如您可能想要的那样。

http://www.firebirdfaq.org/faq260/

如果有的话,Windows LOCAL_SYSTEM用户被明确禁止进行大多数网络操作以包含入侵者和病毒。即使你攻击Firebird打开网络文件,很可能Windows无论如何都会禁止这种访问,除非您设置Windows以使用默认LOCAL_SYSTEM以外的某个用户帐户运行Firebird Server服务。

无论如何,\\tt2012server\persoonlijk\jan\klanten.gdb连接字符串实际上意味着您要求应用程序使用tt2012server(又名Microsoft命名管道)协议连接到WNET并找到在该服务器上运行的Firebird服务器并且通过WNET协议进行通信,而不是TCP / IP协议。

根据您引用的错误判断 - lUNC := '\\2012server'; // Unable to complete network request to host - 上述 tt2012server 计算机可能没有运行Firebird服务器并接受命名管道连接。

WNET协议被认为已过时,很可能会从未来的Firebird Server版本中删除。截至目前它正在运作,但很少有人使用它,因此该领域几乎没有最新的经验。建议您默认使用TCP / IP协议将应用程序连接到运行在 tt2012server 计算机上的Firebird服务器,而不是WNET协议。

PS。这个问题有重复:

PPS。 Firebird是一个多代数据库引擎。

因此,Interbase / Yaffil / Firebird系列中没有“脏读”交易。

TxOptions.Isolation := xiDirtyRead; - 此行不起作用。很可能它会默默地将事务类更改为“READ COMMITTED”,不太可能会给出明确的错误。