标签: data-integrity

如何验证 postgres 9.3 db 没有损坏?

我有一个在 ubuntu 服务器上运行的 postgres 9.3 db。
大约一个月前,我们的 VPS 托管公司解决了服务器上的硬件问题。

问题很快得到解决,一切似乎都运行良好。
我们使用另一台服务器上的酒保运行备份 - 备份和恢复工作正常(我检查过)。

数据损坏的第一个迹象是几天前:我决定在我们的数据库上做一个完整的 pg_dump,就像我每隔一段时间做的那样,它失败了(块中的页头无效......) - 数据似乎已经很久以前就损坏了 - 大约在硬件问题发生的时候(那是损坏记录上的日期)。我求助于查找损坏的记录,然后将其删除并手动恢复。

在那之后,我能够做一个完整的 pg_dump。

为了检查其他损坏 - 我从备份中设置了不同的数据库服务器并对所有表运行 pg_repack 以验证我能够重建所有索引和表。

我的问题是:
1. 我如何确定我的数据库中没有任何额外的损坏?

2. 如何定期检查我的数据完整性?
3. 除了转储整个数据库并重新索引它(我已经这样做了)之外,我还能做些什么来验证我们数据库的完整性?

PS - 我没有启用块校验和。

postgresql corruption data-integrity postgresql-9.3

6
推荐指数
1
解决办法
6749
查看次数

根据不同表中的相关数据约束数据。这应该在数据库级别还是应用程序级别完成?

我正在开发一个数据库,其中包含我们的客户信息以及有关我们供应商的信息。其中一部分包括将我们的客户与我们的供应商匹配、这些供应商为我们的客户提供给我们的帐号以及我们向客户收取使用这些供应商服务的费用。

背景

在我现在处理的情况下,我有一个表格,其中包含我们客户的帐号、供应商 ID 和该供应商分配给我们客户的帐号。

我还有一个表格,其中包含我们所有供应商的信息和一个相关表格,其中列出了他们的所有服务以及该服务的“基本成本”。

问题

我遇到的问题是将客户与供应商的服务相关联。

如果我只是创建一个表,其中包含我们客户的帐号、供应商的服务 ID 和该服务的成本,那么我可能会遇到不提供该服务的供应商将服务分配给客户的问题。

这是我正在谈论的内容的图表(尽管很粗糙):

图表

因为 VendorServices 和 CustomerVendorServices 之间没有“检查”,所以我可能会在 CustomerVendorServices 表中 VendorServiceID 的位置插入一条记录,用于供应商不提供的服务。

这显然是一个问题,我可以通过与该数据库交互的应用程序的接口来防止它发生,但是如果有一种方法可以让数据库“检查”VendorServiceID 被插入到CustomerVendorServices 表匹配由与 VendorAccountsID/VendorAccountNumber 关联的供应商提供的服务。

我确信这不会令人困惑,如果有人试图理解它,老实说我会感到惊讶,但我想我会试一试。:)

任何帮助和/或建议将不胜感激。

database-design referential-integrity data-integrity relations

5
推荐指数
1
解决办法
79
查看次数

跨表中所有数据的复杂约束

我们有一个表来记录系统上发生的处理,我们需要确保只有一行处于“处理中”状态。

我想确保结果始终为零或一:

select count(id) from jobs where status in ('P', 'G');
Run Code Online (Sandbox Code Playgroud)

我们正在使用显式事务,因此理想情况下,此检查将在提交时进行,如果不变量不成立则中止事务。对于我们来说,处理任何偶尔会引发错误的异常处理比突然以多个“正在进行”的工作结束要容易得多。

该解决方案只需要与 Postgres 一起使用,因此我们很乐意为此采用非标准解决方案。我们目前使用 8.4,但如果有任何不同,我们将在某个时候升级到 9.x。

postgresql constraint transaction data-integrity postgresql-8.4

4
推荐指数
1
解决办法
3173
查看次数

当引用可以通过或直接引用时保持 3 个表之间的完整性

假设我们有以下 3 个表:

tUsers (ID, name, countryID, regionID)
------
1  |  Joe  |  1   |  1
2  |  Sue  | NULL |  2
3  |  Bob  |  2   |  NULL
4  |  Amy  | NULL |  NULL

tCountries (ID, name, regionID)
------
1  |  USA   |  1
2  |  China |  3

tRegions (ID, name)
------
1  |  North America
2  |  Central America
3  |  East Asia
4  |  Europe
Run Code Online (Sandbox Code Playgroud)

DB 是否有一种方法可以防止用户在国家/地区不匹配的同时仍然允许一个或两个为 NULL?例如,查询UPDATE tUsers SET regionID=4 WHERE ID …

database-design sql-server data-integrity

4
推荐指数
1
解决办法
255
查看次数

如何对SQL Server数据库备份文件进行完整性测试?

我被指派每两周检查一次来自 sql server 的数据库备份的完整性。我是这个领域的新手,所以我不知道如何正确地完成这项任务。如果有人(黑客)修改了数据库备份里面的数据,这是否是文件完整性的一部分?有没有办法检查它?

sql-server backup data-integrity

2
推荐指数
1
解决办法
1104
查看次数

-2147483648 整数类型列中的值,尽管输入掩码

我有一个带有文本框字段的桌面应用程序,它是一个带有掩码值的RadMaskedNumericInput#6,这意味着它只能有 6 位数字。我将它存储在int类型的数据库列中。

当我检查数据库时,列中的某些值是 -2147483648。

我已尝试输入许多值,但无法重现此场景。我只能在此屏幕中输入 6 位数字。我尝试了最大值 999999,但它保持不变。

我只是获取文本框值,将其转换为int,然后通过存储过程将其插入到数据库中。

int value = (int)txtPrice.value;
Run Code Online (Sandbox Code Playgroud)

我试图输入负值以及尝试添加字母,但由于掩码,它不允许我添加除整数以外的任何值。

根据我的理解和知识,只有桌面应用程序可以插入或更新此列的值。

有谁知道为什么会这样?我该如何预防?

sql-server constraint data-integrity

-1
推荐指数
1
解决办法
460
查看次数