Skip to content

Commit 9b2b97c

Browse files
thewheatChrisChinchillagithub-actions[bot]
authored
docs: update database error page to document more errors (supabase#40006)
* docs: update database error page to document more errors * Update apps/docs/content/troubleshooting/dashboard-errors-when-managing-users-N1ls4A.mdx Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update apps/docs/content/troubleshooting/dashboard-errors-when-managing-users-N1ls4A.mdx Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * prettier fixes --------- Co-authored-by: Chris Chinchilla <[email protected]> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent 6f759f4 commit 9b2b97c

File tree

1 file changed

+97
-38
lines changed

1 file changed

+97
-38
lines changed

apps/docs/content/troubleshooting/dashboard-errors-when-managing-users-N1ls4A.mdx

Lines changed: 97 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
2-
title = "Dashboard errors when managing users"
2+
title = "Errors when creating / updating / deleting users"
33
github_url = "https://github.com/orgs/supabase/discussions/21247"
44
date_created = "2024-02-14T04:26:37+00:00"
5-
topics = [ "auth", "studio" ]
5+
topics = [ "auth", "database", "studio" ]
66
keywords = [ "users" ]
77
database_id = "c5d8260b-c17a-4f6c-ab20-801f953f6c94"
88

@@ -13,49 +13,108 @@ sdk = [ "auth-signup" ]
1313
message = "Failed to send magic link: failed to make magiclink request: Error sending magic link"
1414

1515
[[errors]]
16-
message = "Failed to delete user: Database error deleting user"
16+
http_status_code = 500
17+
code = "unexpected_failure"
18+
message = "Database error saving new user"
1719

1820
[[errors]]
19-
message = "Failed to create user: Database error creating new user"
21+
http_status_code = 500
22+
code = "unexpected_failure"
23+
message = "Failed to create user"
2024

2125
[[errors]]
2226
http_status_code = 500
23-
message = "Database error saving new user"
27+
code = "unexpected_failure"
28+
message = "Database error creating new user"
29+
30+
[[errors]]
31+
http_status_code = 500
32+
code = "unexpected_failure"
33+
message = "Failed to delete user"
34+
35+
[[errors]]
36+
http_status_code = 500
37+
code = "unexpected_failure"
38+
message = "Database error deleting user"
39+
40+
[[errors]]
41+
http_status_code = 500
42+
code = "unexpected_failure"
43+
message = "Error updating user"
44+
45+
[[errors]]
46+
http_status_code = 500
47+
code = "unexpected_failure"
48+
message = "Database error updating user"
49+
2450
---
2551

26-
## PROBLEM
52+
These error are normal a side effect of issues in your custom user management logic. This can cause errors that return HTTP `500` status codes with a of code `unexpected_failure` and one of the following error messages
53+
54+
- Failed to create user: Database error creating new user
55+
- Failed to update user: Error updating user
56+
- Failed to delete user: Database error deleting user
57+
- Database error updating user
58+
- Database error saving new user
59+
60+
## Debugging this error
61+
62+
- [Auth logs](/dashboard/project/_/logs/auth-logs): as the error relates to [Auth](/docs/guides/auth) users
63+
- [Postgres logs](/dashboard/project/_/logs/postgres-logs): for raw error logs related to database
64+
65+
## Common causes of this error:
66+
67+
- Trigger/trigger function setup on the `auth.users` table
68+
- A constraint on the `auth.users` table which isn't being met
69+
- You are using Prisma and it has broken all the permissions on the `auth.users` table
2770

28-
### Receiving the following or _similar_ error messages in the Dashboard when managing users.
71+
## Example error messages
2972

30-
> ... Database error
31-
> ... Error sending
73+
Use the hints provided in the error message to fix issues in your custom user management logic.
3274

33-
<img
34-
width="243"
35-
src="https://github.com/supabase/supabase/assets/91111415/91732e7d-0e83-4bc8-8ce3-57ebd871d981"
36-
/>
37-
<img
38-
width="271"
39-
src="https://github.com/supabase/supabase/assets/91111415/30f4cd9f-3736-40ae-8606-2f060cfac0d0"
40-
/>
41-
<img
42-
width="271"
43-
src="https://github.com/supabase/supabase/assets/91111415/50961019-b461-44cb-9e4b-f1361aa3ad5d"
44-
/>
75+
**Trigger/trigger function related error messages** - [Solution for trigger related issues](#solution-trigger)
4576

46-
### Or, receiving a comparable 500 error from the Auth REST API:
77+
```
78+
"error":"error update user`s last_sign_in field: ERROR: permission denied for table profiles (SQLSTATE 42501)"
79+
```
80+
81+
**Constraint related error message** - [Solution for constraint related issues](#solution-constraint)
82+
83+
```
84+
ERROR: 23503: update or delete on table "users" violates foreign key constraint "profiles_id_fkey" on table "profiles"
85+
DETAIL: Key (id)=(7428a53c-75b7-4531-9ae9-1567d9c4ac0a) is still referenced from table "profiles".
86+
```
87+
88+
**Missing column**
89+
90+
```
91+
ERROR: column \"updated_at\" of relation \"profiles\" does not exist (SQLSTATE 42703)
92+
```
93+
94+
**Broken search path / incorrect name** - [42P01 related solution](docs/guides/troubleshooting/resolving-42p01-relation-does-not-exist-error-W4_9-V)
4795

48-
> Database error ...
96+
```
97+
failed to close prepared statement: ERROR: current transaction is aborted, commands ignored until end of transaction block (SQLSTATE 25P02): ERROR: relation \"public.profiles\" does not exist (SQLSTATE 42P01)
98+
```
99+
100+
---
101+
102+
## Solution for constraint related issues [#solution-constraint]
49103

50-
<img
51-
width="496"
52-
alt="Screenshot 2024-02-13 at 10 59 17 PM"
53-
src="https://github.com/supabase/supabase/assets/91111415/cd151dda-5160-415c-925c-cea332887641"
54-
/>
104+
- Check for foreign/primary key relationship between the `auth.users` table and another table
105+
- Then ALTER the [behavior](https://stackoverflow.com/questions/5383612/setting-up-table-relations-what-do-cascade-set-null-and-restrict-do) of the relationship and recreate it with a less [restrictive constraint](https://stackoverflow.com/questions/3359329/how-to-change-the-foreign-key-referential-action-behavior).
106+
- If this is related to deleting records, review the [Cascade Deletes doc](/docs/guides/database/postgres/cascade-deletes) for possible approaches (e.g. using `CASCADE` / `SET NULL`)
55107

56-
## SOLUTION 1 (trigger related)
108+
---
57109

58-
Check if the auth schema contains any triggers in the [Dashboard's trigger section](/dashboard/project/_/database/triggers). Remove all triggers by dropping their functions with a CASCADE modifier:
110+
## Solution for trigger related issues [#solution-trigger]
111+
112+
Supabase Auth uses your project's database to store user data. It relies on the `auth` schema, and Supabase restricts access to the `auth` schema to prevent unintended custom changes that could break the functionality of the Auth service.
113+
114+
Check if the `auth` schema contains any triggers in the [Dashboard's trigger section](/dashboard/project/_/database/triggers?schema=auth).
115+
116+
1. Identify related functions using `security invoker` from the [Dashboard's function section](/dashboard/project/_/database/functions)
117+
2. Remove all triggers by dropping their functions with a CASCADE modifier shown below (This command still works because the `postgres` role has the ownership of the function, and the `CASCADE` clause will drop the trigger indirectly.)
59118

60119
```sql
61120
DROP FUNCTION <function name>() CASCADE;
@@ -64,8 +123,10 @@ DROP FUNCTION <function name>() CASCADE;
64123
-- DROP TRIGGER <trigger_name> on auth.<table_name>;
65124
```
66125

67-
Then recreate the functions with a [security definer](/docs/guides/database/functions#security-definer-vs-invoker) modifier before recreating the triggers.
126+
3. Recreate the functions with a [security definer](/docs/guides/database/functions#security-definer-vs-invoker) modifier
127+
4. Recreate the triggers
68128

129+
**Example function and trigger using security definer**
69130
The [SQL Editor](/dashboard/project/_/sql/) contains a template for [User Management](/dashboard/project/_/sql/quickstarts). Within it, there is a working example of how to setup triggers with security definer that may be worth referencing:
70131

71132
```sql
@@ -81,7 +142,9 @@ create table profiles (
81142
);
82143

83144
create function public.handle_new_user()
84-
returns trigger as $$
145+
returns trigger
146+
set search_path = ''
147+
as $$
85148
begin
86149
insert into public.profiles (id, full_name, avatar_url)
87150
values (new.id, new.raw_user_meta_data->>'full_name', new.raw_user_meta_data->>'avatar_url');
@@ -94,12 +157,8 @@ create trigger on_auth_user_created
94157
for each row execute procedure public.handle_new_user();
95158
```
96159

97-
### EXPLANATION
160+
### Explanation
98161

99-
One of the most common design patterns in Supabase is to add a trigger to the `auth.users` table. The database role managing authentication (supabase_auth_admin) only has the necessary permissions it needs to perform its duties. So, when a trigger operated by the supabase_auth_admin interacts outside the auth schema, it causes a permission error.
162+
One of the most common design patterns in Supabase is to add a trigger to the `auth.users` table. The database role managing authentication (`supabase_auth_admin`) only has the necessary permissions it needs to perform its duties. So, when a trigger operated by the `supabase_auth_admin` interacts outside the auth schema, it causes a permission error.
100163

101164
A security definer function retains the privileges of the database user that created it. As long as it is the `postgres` role, your auth triggers should be able to engage with outside tables.
102-
103-
## SOLUTION 2 (constraint related)
104-
105-
If you did not create a trigger, check if you created a foreign/primary key relationship between the auth.users table and another table. If you did, then ALTER the [behavior](https://stackoverflow.com/questions/5383612/setting-up-table-relations-what-do-cascade-set-null-and-restrict-do) of the relationship and recreate it with a less [restrictive constraint](https://stackoverflow.com/questions/3359329/how-to-change-the-foreign-key-referential-action-behavior).

0 commit comments

Comments
 (0)