我的数据库具有以下结构:
CREATE TYPE instrument_type AS ENUM (
'Stock',
...
'Currency',
...
);
CREATE FUNCTION get_instrument_type(instrument_id bigint) RETURNS instrument_type
LANGUAGE plpgsql STABLE RETURNS NULL ON NULL INPUT
AS $$
BEGIN
RETURN (SELECT instr_type FROM instruments WHERE id = instrument_id);
END
$$;
CREATE TABLE instruments (
id bigserial PRIMARY KEY,
instr_type instrument_type NOT NULL,
...
);
CREATE TABLE countries_currencies (
...
curr bigint NOT NULL
REFERENCES instruments (id)
ON UPDATE CASCADE ON DELETE CASCADE
CHECK (get_instrument_type(curr) = 'Currency'),
...
);
如您所见,我使用一张常用的仪器表。有很多外键引用该表。但是某些表格(例如 countries_currencies)要求引用的项目是“货币”。由于我不能在 CHECK 约束中使用子查询,所以我必须使用函数。有一天,一个坏人可能会将 instrument_type 从“货币”更改为其他东西。如果表 country_currencies 中有一行,引用修改后的工具,CHECK 将对该行无效。但是 CHECK 将应用于新行,而不是已经存在的行。
是否有任何标准方法来重新验证 CHECK?我想运行这样的程序作为一般数据完整性测试的一部分。
PS我知道,我可以在桌面仪器上写触发器,如果有东西坏了就禁止改变。但它需要确保我检查所有引用表及其约束,因此无论如何它都容易出错。