【问题标题】:Postgres: Can I bypass the error "cannot insert into generated column" using a PostgreSQL INSTEAD OF INSERT rule?Postgres:我可以使用 PostgreSQL INSTEAD OF INSERT 规则绕过错误“无法插入生成的列”吗?
【发布时间】:2021-04-15 03:29:25
【问题描述】:

我知道这并不漂亮,但绕过错误插入到 Postgres 中生成的列中会很有帮助。假设我们有一个这样的表:

create table testing (
    id int primary key,
    fullname_enc bytea,
    fullname text generated always as (pgp_sym_decrypt(fullname_enc, 'key')) stored
);

如下查询返回预期错误:ERROR: cannot insert into column "fullname" DETAIL: Column "fullname" is a generated column.

insert into testing(id, fullname) values (3, 'John Doe');

我想在这个表上的 INSERT 上创建一个规则,例如:

create rule encrypter as on insert to testing DO INSTEAD insert into testing (id, fullname_enc) values (new.id, pgp_sym_encrypt(new.fullname, 'key'));

由于我们重写了查询,我天真地想这是否不会导致引擎出错,但它仍然会。知道如何实现吗?

问这个的原因是迁移到 PostgreSQL 12。

【问题讨论】:

    标签: postgresql rules generated-columns


    【解决方案1】:

    这是无法实现的,如果能以某种方式实现,那将是一个需要修复的错误。否则,从转储中恢复会更改值。

    我认为您需要的是一个设置fullnameBEFORE 触发器。

    我希望这是一个模拟示例,而不是为了提高安全性。

    【讨论】:

    • 这当然是一个模拟示例。我想从我的角度来看,看到这个工作太愚蠢了,因为我天真地认为由规则重写的实际查询不会失败(因为那里排除了全名列)。
    • 好。正如我所说,触发器应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2021-12-24
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多