【发布时间】:2020-10-27 06:33:16
【问题描述】:
我正在使用 Postgres 和 postgres-migrations 来处理数据库迁移。
在第一个迁移脚本中,已定义基于以下 ENUM 标签的 TYPE。一个用户可以有多个角色。
CREATE TYPE user_role AS ENUM('PRIMARY', 'BILLING', 'CONTENT');
到目前为止,此类型已在 DB 中的两个表中使用,位于分配的 user_roles[] 数组中 - 列角色(这里是一个示例):
CREATE TABLE memberships (
id uuid DEFAULT uuid_generate_v1() PRIMARY KEY,
organisation_id uuid NOT NULL REFERENCES
organisations(id),
roles user_role[] NOT NULL,
user_id uuid NOT NULL REFERENCES users(id)
);
我的目标是添加一个“ADMIN”用户角色,同时还希望在以后的迁移脚本中将“CONTENT”重命名为“EDITOR”。
我最初尝试过,
ALTER TYPE user_role ADD VALUE 'ADMIN';
ALTER TYPE user_role RENAME VALUE 'CONTENT' TO 'EDITOR';
但是我遇到了以下错误:
ALTER TYPE ... ADD 不能在 runMigrations 的事务块内运行
经过多次尝试在网上找到的解决方案后,我得出了这个结论:
ALTER TYPE user_role RENAME TO user_role_old;
CREATE TYPE user_role AS ENUM('PRIMARY',
'ADMIN', 'EDITOR', 'BILLING');
ALTER TABLE memberships ALTER COLUMN roles TYPE
user_role USING roles::text::user_role;
ALTER TABLE organisation_invites ALTER COLUMN
roles TYPE user_role USING
roles::text::user_role;
DROP TYPE user_role_old;
这现在在user_role 类型中给出了正确的标签,但是这用user_roles 替换了user_roles[] 的角色列类型。因此,我现在只能为一个不好的用户分配一个角色。我相信这与铸造和使用 text 有关,但我不确定。
【问题讨论】:
标签: database postgresql enums