Postgres:我可以使用 PostgreSQL INSTEAD OF INSERT 规则绕过错误 "cannot insert into generated column" 吗?
Postgres: Can I bypass the error "cannot insert into generated column" using a PostgreSQL INSTEAD OF INSERT rule?
我知道这不太好,但绕过插入到 Postgres 中生成的列中的错误会很有帮助。比方说,我们有一个像这样的 table:
create table testing (
id int primary key,
fullname_enc bytea,
fullname text generated always as (pgp_sym_decrypt(fullname_enc, 'key')) stored
);
类似以下的查询 returns 预期错误:ERROR: cannot insert into column "fullname" DETAIL: Column "fullname" is a generated column.
insert into testing(id, fullname) values (3, 'John Doe');
我想在 table 的 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。
这是无法实现的,如果能以某种方式实现,那将是一个需要修复的错误。否则,从转储中恢复会更改值。
我认为您需要的是一个设置 fullname
.
的 BEFORE
触发器
我希望这是一个模拟示例,而不是旨在提高安全性的东西。
我知道这不太好,但绕过插入到 Postgres 中生成的列中的错误会很有帮助。比方说,我们有一个像这样的 table:
create table testing (
id int primary key,
fullname_enc bytea,
fullname text generated always as (pgp_sym_decrypt(fullname_enc, 'key')) stored
);
类似以下的查询 returns 预期错误:ERROR: cannot insert into column "fullname" DETAIL: Column "fullname" is a generated column.
insert into testing(id, fullname) values (3, 'John Doe');
我想在 table 的 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。
这是无法实现的,如果能以某种方式实现,那将是一个需要修复的错误。否则,从转储中恢复会更改值。
我认为您需要的是一个设置 fullname
.
BEFORE
触发器
我希望这是一个模拟示例,而不是旨在提高安全性的东西。