[PostgreSQL] 有些雷踩過才知道: 42P01與42501

Shan
C.Shan
Published in
Dec 29, 2020

42P01 Error: relation does not exist

公司專案的正式機與測試機,突然登入異常,錯誤訊息如下:

System.AggregateException: One or more errors occurred. (42P01: relation “auth_users” does not exist)
未知的 schema

檢查資料庫的關聯與資料,一切正常,但發現幾個未知的schema。

在錯誤發生位置 TryCatch 後,從取得的 SQL 語法中,發現語法少了`public` schema的前綴(如下),導致無法存取到對應的資料。

SELECT  * FROM auth_users;

但實際上用以下語法,在資料庫執行,可以成功查詢表中的資料。

SELECT * FROM public.auth_users;

當下判斷是程式無法存取到對應的schema,因此先刪除其餘未知的schema,但並未解決 42P01 異常。

最後是調整資料庫設定: database > properties > parameters > search_path ,刪去除了 ”$user”, public 以外的選項,成功排除 42P01 異常。

search_path 設定

Postgres 的 connection string 無法指定 database 中的 schema,但另外查到可以在程式 Context > OnModelCreating 中,用 HasDefaultSchema 去指定shcema。可參考以下文件:

42501: permission denied

為了實測 HasDefaultSchema 是否能指定 schema,必須在資料庫建 2 個以上的 schema 及 search_path,還原 42P01 異常。

但在本機連測試資料庫,遇到 42501 異常,測試帳號無法成功將資料寫入資料庫。有的表可以寫入,但有的表卻不能寫入。會出現錯誤訊息:

[42501]ERROR: permission denied for schema public

最後利用 GrantWizard 中,選擇授權的對象與內容,並在執行語法後,成功排除 42501 異常。

GrantWizard
資料庫權限設定

最後在本機建立 2 個 schema 與 search_path 後,並沒有遇到 42P01 異常,本機的網站是可以正常登入,也能讀取資料。判斷 42P01 問題,資料庫可能還有其他設定。因此,暫時無法測試 HasDefaultSchema。

若有謬誤,煩請告知,新手發帖請多包涵 (此句以致敬某前輩 XD)

感謝各位(・∀・)つ

--

--

Shan
C.Shan
Editor for

過去學習機械理論,現在撰寫網頁程式。我喜歡唱歌,喜歡畫畫,喜歡旅遊,存在藝術的感性,也兼具工程師的理性。腦容量87%,未來期望用文字、影像紀錄經歷。