У меня есть таблица ролей, которая выглядит следующим образом:
Table "public.roles"
Column | Type | Modifiers
-----------------+---------+----------------------------------------------------
id | integer | not null default nextval('roles_id_seq'::regclass)
name | text | not null
organization_id | integer |
is_system | boolean | default false
definition | jsonb | default '{}'::jsonb
Indexes:
"roles_pkey" PRIMARY KEY, btree (id)
"roles_name_organization_id_idx" UNIQUE, btree (name, organization_id)
Foreign-key constraints:
"roles_organization_id_fkey" FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE
Referenced by:
TABLE "role_roles" CONSTRAINT "role_roles_subject_role_id_fkey" FOREIGN KEY (subject_role_id) REFERENCES roles(id) ON DELETE CASCADE
TABLE "role_roles" CONSTRAINT "role_roles_target_role_id_fkey" FOREIGN KEY (target_role_id) REFERENCES roles(id) ON DELETE CASCADE
TABLE "user_roles" CONSTRAINT "user_roles_role_id_fkey" FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
Triggers:
add_pg_role_on_add BEFORE INSERT OR UPDATE ON roles FOR EACH ROW EXECUTE PROCEDURE add_pg_role_on_add()
delete_pg_role_on_delete BEFORE DELETE ON roles FOR EACH ROW EXECUTE PROCEDURE delete_pg_role_on_delete()
И представление "api". "Роли", которое выглядит как
CREATE VIEW api.roles AS SELECT * FROM roles WHERE organization_id IN (select * from organization_ids()) OR is_superuser();
Где organization_ids - это функция, которая возвращает организации, членом которых является пользователь.
Когда я делаю запрос вставки, как это:
INSERT INTO "api"."roles" ("id", "name", "organization_id", "definition") VALUES (DEFAULT, 'coder', 289, '{}'::jsonb)
ON CONFLICT ("name", "organization_id")
DO UPDATE SET "name" = EXCLUDED."name", "definition" = EXCLUDED."definition",
"organization_id" = EXCLUDED."organization_id";
Я получаю следующую ошибку:
ERROR: attribute 5 has wrong type
DETAIL: Table has type integer, but query expects jsonb.
Я погуглил и не могу понять, что он пытается сказать, что это неправильно с этой вставкой. Если я удаляю бит EXCLUDED.definition
, запрос работает. Кажется, это не зависит от фактического значения definition
, которое вставляется, а скорее от того, что я обновляю столбец определения. Я также могу обновить столбец определения для записей в этом представлении, используя команду UPDATE
. Кажется, это просто разрушенная пустыня.
Кто-нибудь знает, что вызывает это или как это исправить?
Заранее спасибо!