1

我的数据库具有以下结构:

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我知道,我可以在桌面仪器上写触发器,如果​​有东西坏了就禁止改变。但它需要确保我检查所有引用表及其约束,因此无论如何它都容易出错。

4

1 回答 1

2

您可以简单地更新所有行以触发 CHECK:

UPDATE countries_currencies SET curr = curr;
于 2013-08-13T20:07:50.123 回答