将备份数据库从生产环境导入到开发环境时出现奇怪的错误。
场景如下:
- Postgres 13.x
- PG管理员4
- 迁移文件由 dbmate 生成,并在两个环境中创建完全相同的表。至少我是这么想和希望的。
- 备份是通过 PGAdmin 完成的,仅导出数据(没有架构,什么也没有)
好吧,这是最简单的部分。
我使用 PgAdmin 的导入几乎可以正常工作,但在 1 个特定表中出现 1 个异常。该表对其列之一使用用户定义的类型,并定义一个约束,在检查约束时,该约束在函数内使用该用户定义的类型。
整个事情大致是这样的:
CREATE TYPE status AS ENUM ('ACTIVE','DEACTIVE');
CREATE TABLE my_table (
id varchar(36) NOT NULL PRIMARY KEY,
created_at timestamp NOT NULL,
updated_at timestamp NOT NULL,
...
total decimal NOT NULL,
value JSONB NOT NULL,
state status
);
CREATE OR REPLACE FUNCTION complex_constraint_function(value JSONB, total decimal, state status)
RETURNS boolean AS $$
DECLARE
result boolean default false;
BEGIN
IF state = 'ACTIVE'::status THEN
BEGIN
--do some complex JSONB stuff
-- return true if everything is fine
RETURN true;
END;
ELSE
RETURN false;
END IF;
END;
$$ LANGUAGE plpgsql;
ALTER TABLE my_table
ADD CONSTRAINT check_complex_constraint
CHECK (complex_constraint_function(value, total, state));
我在数据库中使用多个用户定义的类型,它们都工作正常。我正在使用多个使用函数的约束,它们都工作正常。但这张特殊的桌子让我很头疼。
通过 PGAdmin 将备份导入开发环境时,在检查约束时出现以下错误
pg_restore: error: COPY failed for table "my_table": ERROR: type "status" does not exist
LINE 1: state = 'ACTIVE'::status
^
QUERY: state = 'ACTIVE'::status
CONTEXT: PL/pgSQL function public.complex_constraint_function(jsonb,numeric,public.status) line 6 at IF
我双重和三次检查了两个数据库中是否存在该 ENUM 类型(老实说没有其他方法,因为开发数据库是使用 dbmate 定期重建的)。老实说,我不知道这是怎么回事。当使用 dev-db 运行我的测试用例时,这个约束就存在(我正在明确测试这一点)。
有人见过这样的事情吗?或者关于如何调试这个的任何想法(除了删除约束)?
谢谢