SQLSTATE 42710Severity lowLab verified

Incident brief

Duplicate object

A CREATE ROLE named a role that already exists. PostgreSQL refused to create a second role under the same name.

Reproduced on PostgreSQL 16.14Verified 2026-07-16 (Docker lab, PostgreSQL 16.14)Reviewed by Verified against PostgreSQL 16.14 in an isolated lab environment

In 10 seconds

What
Duplicate object
What triggers it
CREATE ROLE with a name that already exists.
The fix
Wrap the CREATE ROLE in a DO block that catches the duplicate_object exception, for idempotent setup scripts.
Proof
Reproduced on PostgreSQL 16.14 → Creating a role with a name that already existed was rejected with SQLSTATE 42710. Exactly one role with that name still exists afterward.

The fix

What to do right now

The immediate, application-level response to this error.

  • Wrap the CREATE ROLE in a DO block that catches the duplicate_object exception, for idempotent setup scripts.
  • Otherwise, check pg_roles first and only create the role if it's missing.
  • Don't widen the exception handler to WHEN OTHERS — see the counterexample for what that silently hides.
Fix — SQL
DO $$ BEGIN
  CREATE ROLE reporting_ro;
EXCEPTION WHEN duplicate_object THEN
  NULL;
END $$;

Related & next steps

Follow the thread

Everything this error touches — jump straight to the sibling error, term, runbook, or parameter.

Verification

PG 16.14
Last verified
2026-07-16 (Docker lab, PostgreSQL 16.14)
Reviewed by
Verified against PostgreSQL 16.14 in an isolated lab environment
Audit status
reviewed