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