我收到客户数据库进行调查时遇到了奇怪的情况。
系统设置:
当我第一次看到数据库时,一切似乎都非常一致。但是,在第一次启动期间,在某些表中添加了两行而没有检测到任何SQL执行。我已经通过调试器确认应用程序没有添加这些行。我还使用了Audit and Trace inferface(fbtracemgr),并在日志文件中看到没有这样的行添加到数据库中。
有一个暗示原始数据库中存在错误。包含该问题的表使用INSERT触发器从生成器设置表行的ID列值。现在,原始数据库中的生成器值似乎太高了。这使我认为“ghost数据”已经在某种缓存中输入到文件中,因为生成器已经递增1。
结果是在添加了两个ghost行之后,对表的下一个实际添加导致异常:
FirebirdSql.Data.FirebirdClient.FbException (0x80004005): violation of
PRIMARY or UNIQUE KEY constraint "INTEG_275" on table "DATALOG" --->
violation of PRIMARY or UNIQUE KEY constraint "INTEG_275" on table
"DATALOG"
因为已存在生成器建议的具有相同ID的行。
是否存在持久的“未保存数据缓存”,其中可能包含在先前应用程序运行期间输入的行数据?什么可能导致这种情况?数据库写入或备份期间断电?
有什么想法吗?
Firebird服务器v 2.5.9.26074
没有这样的版本发布。
Firebird-2.5.8.27089 http://www.firebirdsql.org/en/firebird-2-5/
基本上你似乎使用了一些不稳定的FB开发人员内部构建,这可能会产生任何数量的奇怪的反作用。
所以我建议使用标准发布版本如果使用快照构建是出于某些无法解释的原因 - 要求开发人员使用firebird-support邮件列表 - qazxsw poi
虽然不要屏住呼吸以获得对异国情调的Firebird构建的大量支持。
UPD。感谢马克,这里是:http://www.firebirdsql.org/en/support/
2.5.0 - 是发动机重大改造后的第一个版本。显然不是最稳定的。例如,下一个2.5.1版本中的索引存在问题。
如果行为将在标准2.5.8 Firebird上重复,那么我建议将所有数据库(至少所有元数据,但也可能是数据)导出到长文本文件,SQL脚本中,然后搜索表中的表名。例如,可能存在添加一些数据的on-database-connect触发器。或存储过程。或者对触发器做出的观点。还是别的东西。例如 - 虽然医疗事故 - 甚至UDF函数可能会使它自己的数据库连接并做一些事情,尽管这应该在FBTrace中显示。
但是,在第一次启动期间,在某些表中添加了两行
启动什么?
如果您使用标准工具(如iSQL / FlameRobin / IBExpert / etc)来连接然后断开与数据库的连接,那么这些行是否仍会被添加?
因为已存在生成器建议的具有相同ID的行
发电机不能建议这样的事情。它只能建议一旦这样的数字被保留用于可能被添加到一个或另一个表中。这并不意味着实际插入了行,插入到该表中,之后没有被删除。
您可以尝试使用禁止的索引进行搜索,以防发生索引损坏,例如
https://www.firebirdsql.org/en/firebird-2-5-0/
还有 select id+0, count(*) from tableName group by 1
在接收客户数据库进行调查时
顺便说一下,他们究竟是如何创建数据库副本的呢?他们做了备份(FBK)吗?如果没有,他们是否在复制之前停止了Firebird服务器?