본문 바로가기
개발자 💻/메모

[Postgres] function "uuid_nil" already exists with same argument types 에러 해결

by 블루로봇 2025. 1. 7.

# 개요

현재 서버 개발을 하면서 Postgres 와 Prisma 를 사용하고 있다.
Migration 을 할 일이 있어 막 지지고 볶다가 너무 작업이 더뎌 냅다 DB Push 를 해버렸다.

yarn prisma db push

Prisma 를 이용하여 DB 모든 것을 덮어 씌우는 마법의 명령어.

그런데 갑자기 DB Push 가 동작하지 않는다!

로컬 환경에서는 너무 잘 되던 것인데, 별도 폐쇄망 개발 환경에서 수행하니 안 되는 것이다.
일전에 Migration 을 씌운 적이 있지만, 그래도 잘 되고 있었는데,
변경된 Prisma Schema 를 DB Push 하려고 하자 오류가 났다.

 

# 오류

Prisma 실행 상의 오류이기 때문에 별도의 오류 문구들이 함께 뜨지만, 결국 요약하면, 제목과 같이 아래 에러 문구를 내뿜었다.

function "uuid_nil" already exists with same argument types

당최 처음 보는 에러이므로 집단지성을 이용하기 위해 열심히 검색했다.
그러나 위와 관련된 에러를 자명하게 설명해주는 곳이 없었다.

아무래도 Postgres 에러인 것 같은 느낌인데 (환경 간에 다를 것은 DB 밖에 없으므로),
검색 결과가 나오지 않는 데다가 아예 처음 겪는 에러여서 감이 오질 않았다.

그러던 중, 유추하기로는 `uuid_nil` 이라는 문구가 있어, 내가 설정하여 사용하는 Postgres Extension 중에 `uuid-ossp` 와 관련된 내용인가 부터 의심하기 시작하면서, 이 문제일 것이라고 생각하고 거꾸로 찾아올라가기 시작했다.

 

# 해결까지의 과정

먼저, Postgres CLI 도구인 `psql` 을 이용하여 Postgres DB 에 접속했다.

psql -h $host -p $port -U $username

이렇게 `psql` 명령어를 작성하면 비밀번호를 물어본다. 싸악 대답해주면 된다.

 

그러면 PSQL 터미널로 들어가게 되는데, 여기서 냅다 위의 `uuid-ossp` extension 생성을 넣어봤다.

postgres=# CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

그랬더니 위의 에러가 발생됐다. 즉, 원인은 나의 Prisma Schema 를 덮어 씌우기 위한 DB Push 명령어의 과정에서 `uuid-ossp` extension 을 새로 생성하고 싶은데, 기존 것과의 무언가 충돌이 있다는 뜻이다. (근데 왜 `uuid-ossp` 는 없고 그 잔재만 있지?)

 

일단 위 에러에서 보이다시피 "function" 상의 문제라고 하니까, PSQL 명령어를 통해 가지고 있는 Function 들을 조회해보자.

postgres=# \df

이 Function 목록을 보면 그토록 찾던 "uuid_nil" function 이 있는 것을 발견할 수 있다.

 

또는 아래 SQL문을 통해 직접 찾을 수도 있다.

SELECT proname, proargtypes, pronamespace::regnamespace
FROM pg_proc
WHERE proname = 'uuid_nil';

이렇게 입력하면, (나의 경우) `public` Schema 내부에 해당 `uuid_nil` 함수가 있다는 것을 알 수 있다.

결국 정리하면, `uuid-ossp` extension 은 없어졌는데요. 그 때 같이 설치되는 function 들은 남아 있습니다. 인 상태이다. 아마 폐쇄망 환경으로 Migration 을 수행할 때, 초기든 뭔가 `uuid-ossp` extension 설치가 올바르게 안 됐고, function 만 남아있어서 충돌이 나는 것으로 보인다.

 

# 해결

그렇다면 뭐 충돌나는 Function 을 삭제해주면 된다.

아래 SQL 명령어를 통해 함수를 보내주자.

DROP FUNCTION IF EXISTS uuid_nil();

 

하고 나서 이제 다시 신나게 Extension 을 추가하자.

DROP EXTENSION IF EXISTS "uuid-ossp";
CREATE EXTENSION "uuid-ossp";

 

갈겨본다. 또 안 된다? 비슷한 에러가 난다? 오류가 나는 function 의 삭제를 계속 반복한다.

DROP FUNCTION IF EXISTS 죽어라함수();

 

계속 지우다 보면, 우리가 원래 이 `uuid-ossp` extension 을 설치한 의도 = 즉, 사용중인 곳으로 인해 아래와 같은 오류가 발생할 수도 있다.

ERROR: cannot drop function uuid_generate_v4() because other object depend on it

우리는 UUID v4 를 이용하여 Postgres 테이블의 ID 를 자동 생성하도록 설정하느라, `uuid-ossp` extension 을 설치하고 이용하고 있는건데, 나머지 function 과의 충돌이 나서 지우다 보니, 이미 이용중인 함수(테이블에 설정되어)가 있어 지울 수 없다는 에러를 만나게 된다.

이걸 해결하기 위해 할 수 있는 방법은... 테이블별로 돌아다니면서 이 함수를 사용하지 않도록 하나하나 변경해주는 것이다.

 

나의 경우에는 이미 에러가 터지면서 Schema 를 사용할 수 없는 상태가 되었어서, 그냥 Schema 를 다 날려버렸다.

마음대로 테이블과 관련된 부분이 변경/삭제 되어서는 안 되는, 운영환경 같은 중요한 곳에서는 절대 아래 명령어들을 남용하면 안 된다!

하지만 그전에 한번 Function 단위에서 CASCADE 로 싹 날려봤다.

DROP FUNCTION $mine CASCADE;

NOTICE: drop cascade to 2 other objects
DETAIL: drop cascades to default value for column id of table authuser
drop cascades to default value for id of table collections

위처럼 연관되어 있던 2개의 설정이 함께 날라갔다고 한다. 나는 또한 생각치 아니하고 Schema 까지 싹 날려버렸다.

DROP SCHEMA $mine CASCADE;
CREATE SCHEMA $mine;

그리고 새롭게 생성해 주었다.

 

그리고 이제 다시 돌아와 프로젝트에서 Prisma 를 이용하여 DB Push 를 해주었다.

yarn prisma db push

해결~!