prisma migrateを実行したのですが、いくつかエラーが出ました。
対応した記録を記事として残しておきます。
同じような状況になっている方の参考になればうれしいです
現状
Next.jsのアプリにPrismaをインストールし、PostgreSQLのDockerコンテナに接続します
バージョン
バージョン | |
Prisma | 5.2.0 |
Node.js | 18.17.0 |
Next.js | 13.4.19 |
Docker | 20.10.21 |
PostgreSQL | 15.4 |
エラー①:Prisma Migrate could not create the shadow database.
エラー文
1 2 3 4 5 6 7 8 9 10 11 12 |
sample-prisma-app$ npx prisma migrate dev --name init Environment variables loaded from .env Prisma schema loaded from prisma/schema.prisma Datasource "db": PostgreSQL database "prismadb", schema "prismaschema" at "localhost:5432" Error: P3014 Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases. Read more about the shadow database (and workarounds) at https://pris.ly/d/migrate-shadow Original error: db error: ERROR: permission denied to create database at schema-engine/core/src/state.rs:270 |
db error: ERROR: permission denied to create database
と出ているので、Database を作成する権限が足りてないようですね。
でも、その権限ってなんで必要なんでしょう??
CREATEDBの権限が必要な理由
エラー文の中にある↓のサイトを見てみます
About the shadow database | Prisma Documentation
About the shadow database
シャドウデータベースを作成するためにCREATEDBが必要とのことです。
必要な権限について確認したい方は↓を見てみてください
About the shadow database | Prisma Documentation
About the shadow database
CREATEDBの権限を付与する
PostgreSQLにログインして、Prismaが使用するユーザーに権限を付与します。
私の場合は、PrismaがPostgreSQLで使用するのは
- USER:prismauser
- DB:prismadb
なので、下記のようにコマンドを実行しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// PostreSQLコンテナにログイン $ docker exec -it postgres psql -U prismauser prismadb psql (15.4 (Debian 15.4-1.pgdg120+1)) Type "help" for help. // prismauserにCREATEDBの権限を追加 prismadb=> ALTER ROLE prismauser CREATEDB; // 権限確認 prismadb=> \du; List of roles Role name | Attributes | Member of ------------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} prismauser | Create DB | {} // 付与されていますね! // ログアウト prismadb=> exit |
権限が付与されたので、再度prisma migrateしてみます
エラー②:no schema has been selected to create in
エラー文
1 2 3 4 5 6 7 8 9 10 11 |
sample-prisma-app$ npx prisma migrate dev --name init Environment variables loaded from .env Prisma schema loaded from prisma/schema.prisma Datasource "db": PostgreSQL database "prismadb", schema "prismaschema" at "localhost:5432" Error: db error: ERROR: no schema has been selected to create in 0: sql_schema_connector::sql_migration_persistence::initialize with namespaces=None at schema-engine/connectors/sql-schema-connector/src/sql_migration_persistence.rs:14 1: schema_core::state::ApplyMigrations at schema-engine/core/src/state.rs:201 |
エラー文でいろいろ調べてみると、スキーマに対するUSAGEの権限がないことが原因っぽい
USAGE:対象がスキーマの場合、それに含まれるオブジェクトへのアクセスを許可
の権限になります
USAGEをユーザーへ付与
こちらもPrismaが使用するユーザーへ権限を付与していきます。
私の場合は、PrismaがPostgreSQLで使用するのは
- USER:prismauser
- DB:prismadb
- SCHEMA:prismaschema
なので、下記のようにコマンドを実行しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
// スーパーユーザーでログイン sample-prisma-app$ docker exec -it postgres psql -U postgres prismadb psql (15.4 (Debian 15.4-1.pgdg120+1)) Type "help" for help. // 権限を確認 // prismadb=# \dn+ prismaschema; List of schemas Name | Owner | Access privileges | Description --------------+----------+-----------------------+------------- prismaschema | postgres | postgres=UC/postgres +| | | prismauser=C/postgres | (1 row) // USAGE権限をprismauserに付与 prismadb=# GRANT USAGE ON SCHEMA prismaschema TO prismauser; GRANT // 権限確認 // prismauser=C/postgres ⇒ prismauser=UC/postgres になっていればOK prismadb=# \dn+ prismaschema; List of schemas Name | Owner | Access privileges | Description --------------+----------+------------------------+------------- prismaschema | postgres | postgres=UC/postgres +| | | prismauser=UC/postgres | (1 row) // ログアウト prismadb=# exit |
解決しました
再度、prisma migrateしてみます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
sample-prisma-app$ npx prisma migrate dev --name init Environment variables loaded from .env Prisma schema loaded from prisma/schema.prisma Datasource "db": PostgreSQL database "prismadb", schema "prismaschema" at "localhost:5432" Applying migration `20230903073559_init` The following migration(s) have been created and applied from new schema changes: migrations/ └─ 20230903073559_init/ └─ migration.sql Your database is now in sync with your schema. Running generate... (Use --skip-generate to skip the generators) added 2 packages, and audited 334 packages in 7s 117 packages are looking for funding run `npm fund` for details found 0 vulnerabilities ✔ Generated Prisma Client (v5.2.0) to ./node_modules/@prisma/client in 343ms |
無事通りましたーー
参考文献
エラー①:Prisma Migrate could not create the shadow database.
CREATE ROLE
CREATE ROLE CREATE ROLE — define a new database role Synopsis CREATE ROLE name option [ …
【初心者向け】PostgreSQLのロールについて分かり易く解説
PostgreSQLで複数のユーザーやグループがデータベースを利用するにあたり、そのアクセス権限を取り決めて設定する必要がある。その際に設定するロールというものについて紹介する
PostgreSQLのロール - Qiita
はじめにみなさんこんにちは。NTTテクノクロス 原田です(いつもはぬこ@横浜名義でQiitaに書いてますが・・・)。これはNTTテクノクロス Advent Calendar 2018の4日目の記…
エラー②:no schema has been selected to create in
GRANT
PostgreSQLの権限と権限設定コマンド - Qiita
【権限には大きく2つに分類される】DBユーザ単位の権限テーブル単位の権限(SQLコマンドのみ設定可)【権限を設定できるコマンドは大きく2種類ある】PostgreSQL標準のコマンド(接続後処…
ロールにテーブルやビューなどに対する権限を追加する(GRANT)
GRANT コマンドを使ってロールに対して権限を追加することができます。権限はテーブルやスキーマの作成する権限や、テーブルやカラムからデータを取得したりデータを追加する権限などです。ここでは PostgreSQL で GANT コマンドを使って権限を追加する方法について解説します。
コメント