PostgreSQL SET session_replication_role = 副本不绕过 Supabase 种子文件中的约束

问题描述 投票:0回答:1

我正在尝试将数据播种到我的 Supabase 数据库中,但即使我的 Seed.sql(由 Supabase 生成)在顶部包含

SET session_replication_role = replica
,约束仍然被强制执行。我通过日志验证复制角色成功更改为“
replica
”(
SELECT current_setting('session_replication_role'
)显示“
replica
”),但我的检查约束
rounds_end_time_check
仍然阻止插入。

sql postgresql constraints supabase seeding
1个回答
0
投票

您需要放弃

NOT NULL
CHECK
约束才能解除它们,即使您的意思是暂时的。

它们不像

foreign key
unique
exclude
(显然是
constraint triggers
)那样由触发器强制执行,因此它们不受
session_replication_role
alter table t1 disable trigger all;
的影响,并且不能被推迟
set constraints
.

可以创建

check
约束
not valid
,但之后仍会检查所有传入行。
db<>fiddle 的演示

create table test(id int not null);
alter table test disable trigger all;
insert into test values(null);
ERROR:  null value in column "id" of relation "test" violates not-null constraint
DETAIL:  Failing row contains (null).
create table test(id int check (id>3));
alter table test disable trigger all;
insert into test values(2);
ERROR:  new row for relation "test" violates check constraint "test_id_check"
DETAIL:  Failing row contains (2).
create table test(id int);--ok
insert into test values(1);--ok
alter table test add constraint id_gt_3 check (id>3) not valid;--ok
insert into test values(2);--error
ERROR:  new row for relation "test" violates check constraint "id_gt_3"
DETAIL:  Failing row contains (2).
© www.soinside.com 2019 - 2024. All rights reserved.