postgresql 尝试将多模式与Prisma和Supabase一起使用时,无法迁移

vaqhlq81  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(157)

我正在学习使用Supabase w/ Postgres在Supabase与以下模式:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["multiSchema"]
}

datasource db {
  provider  = "postgresql"
  url       = env("DATABASE_URL")
  directUrl = env("DIRECT_URL")
  schemas   = ["public", "auth"]
}

enum MedicalCategory {
  GENERAL
  DENTIST
  DERMATOLOGIST
  GYNECOLOGIST
  PEDIATRICIAN
  PSYCHIATRIST
  SURGEON
  UROLOGIST
  OTHER

  @@schema("public")
}

model patients {
  id         String  @id @db.Uuid
  first_name String?
  last_name  String?
  email      String?
  users      users   @relation(fields: [id], references: [id], onDelete: Cascade, onUpdate: NoAction)

  @@schema("public")
}

当尝试推送此消息时,我得到以下错误:

Error: P3016

The fallback method for database resets failed, meaning Migrate could not clean up the database entirely. Original error: 
db error: ERROR: cannot drop table auth.users because other objects depend on it
DETAIL: constraint buckets_owner_fkey on table storage.buckets depends on table auth.users
constraint objects_owner_fkey on table storage.objects depends on table auth.users
HINT: Use DROP ... CASCADE to drop the dependent objects too.
   0: sql_schema_connector::best_effort_reset
           with namespaces=Some(Namespaces("public", ["auth"]))
             at schema-engine/connectors/sql-schema-connector/src/lib.rs:341
   1: schema_core::state::Reset
             at schema-engine/core/src/state.rs:433

显然我不能删除auth.users(为了好玩,我试着拉取db模式,删除users表,使用prisma模式重建表-都不起作用),那么问题是什么呢?
TIA!

jjjwad0x

jjjwad0x1#

错误:P3016

我在我的生产环境中遇到了同样的错误,在挣扎了两天之后。最后,我发现这个错误是由PostgreSQL的登录用户更改引起的。为了解决这个问题,我执行了以下步骤:
转储数据库数据。已更改数据库的所有者。已使用用于创建表的相同所有者恢复数据库。这些操作解决了问题,错误不再发生。
因为在PostgreSQL中,表所有权的概念对于管理权限和访问控制至关重要。表所有者具有与表相关的某些特权和权利,例如修改表结构、插入数据或删除记录的能力。
默认情况下,创建表的用户将成为表的所有者。所有者对表具有完全控制权,可以授予或撤销其他用户的权限。但是,如果将表的所有权更改为其他用户,则可能会导致您遇到的错误**(Error:P3016)**。
在您的示例中,当您从数据库所有者更改PostgreSQL的登录用户时,它会导致与现有表的所有权发生冲突。转储数据库数据、更改所有者并恢复具有相同所有者的数据库解决了此冲突,确保了表所有权和登录用户之间的一致性。
需要注意的是,PostgreSQL的访问控制系统允许对权限进行粒度控制,表所有权只是其中的一个方面。通过仔细管理表所有权并向用户授予适当的权限,您可以维护一个安全且结构良好的数据库环境。

相关问题