无论主键如何,我如何检查两个关系数据库是否相同?

dan*_*tel 3 database sqlite testing perl relational-database

我有一个约100个表的关系数据库.每个表都有唯一的数字主键和合成值,并且有很多外键可以链接表.表格不大(数十或数百或记录).这是一个SQLite数据库.

出于测试目的,我需要通过linux脚本比较数据库的两个副本(简单的bash脚本,perl,diff,sed可用).我需要验证两个数据库的记录数是否相同,并且记录具有相同的内容并转储差异.问题是,只要关系相同,就允许键的值不同.

例如:

存在具有主键"ix_country"和"name"的表"country"以及具有字段"name",主键"ix_customer"和外键"ix_country"的表"customer".

这两个数据库是相同的:第一个数据库:

country:name ="USA"ix_country = 1; customer:name ="Joe"ix_customer = 10 ix_country = 1

第二数据库:

country:name ="USA"ix_country = 1771; customer:name ="Joe"ix_customer = 27 ix_country = 1771

两个副本具有相同的结构.

是否有捷径可寻?

更新:

还有一个要求 - 脚本必须能够抵御结构中的变化.如果添加或删除表或字段,它必须工作.

更新2:

我自己开始研究这个问题.一般策略是编写一个创建"身份映射"文件的SQL脚本.该映射包含每个记录的主键值("人工身份")和"自然身份"键 - 唯一标识记录的字符串.对于数据库中的某些表,有一个唯一的自然id键(就像我的例子中的contry名称).其他表格在序列中需要序数,还有一些表格将其自己的身份与父母身份相结合(如果父母也有父母,则可能是递归的).

所有记录都由第二个SQL脚本以标识人工身份的格式转储到第二个文本文件.

perl脚本用地图中的自然身份替换第二个文件中的所有人工身份.

结果被排序和区分.

And*_*ter 5

有这么容易吗?

不,这需要编程工作.