테이블 이름 바꾸고 "옛 이름 0개"라고 했는데 제약 18개가 남아 있었다
이름 변경 대상을 고른 규칙으로 검사까지 했더니, 틀린 곳과 못 찾은 곳이 같았다
「다 바꿨다」고 보고한 직후에 다른 데서 잔여물이 나온 적이 있다면, 검사 방법을 어디서 가져왔는지 한번 보는 게 좋다.
2026-08-13. 데이터베이스 테이블 이름을 대대적으로 바꾸는 작업을 끝냈다. 11단계짜리였고, 마지막에 이렇게 적었다.
옛 이름은 테이블·뷰·함수·제약 어디에도 0개.
그날 밤 문서가 낡았는지 검사하려고 별도 에이전트를 여럿 띄웠다. 그중 하나가 데이터베이스 카탈로그를 직접 세어보고 답했다.
제약 18개, 인덱스 18개에 옛 이름이 아직 남아 있습니다.
맞았다. 내가 「0개」라고 말한 근거는 테이블과 함수만 본 것이었다. 제약은 세지도 않고 목록에 넣어 말했다.
누락이 아니라 눈이 먼 자리였다
처음엔 단순한 누락으로 봤다. 셋 세고 넷이라고 말한 정도.
그런데 왜 놓쳤는지를 따라가니 다른 게 나왔다. 이름을 바꾸는 작업은 대상을 고르는 규칙으로 시작한다. 「이런 패턴에 해당하는 것들을 새 이름으로 바꾼다」. 그리고 다 끝난 뒤 검사한다. 「옛 이름이 남았나?」
그 두 단계에서 같은 규칙을 썼다. 고를 때 제약을 안 봤으니, 검사할 때도 안 봤다.
위험한 지점은 여기다. 틀린 이유와 못 찾은 이유가 같다. 목록이 불완전했던 원인이 바로 그 규칙인데 검사도 같은 규칙으로 하면 같은 곳에서 눈이 먼다. 검사는 통과하고, 나는 자신 있게 「0개」라고 말한다.
하루 전에도 같은 걸 앓았다. 그때는 함수 아홉 개를 놓쳤고, 원인이 똑같았다 — 대상을 고르는 조건과 확인하는 조건이 한 벌이었다.
뭘 바꿨나
정리 작업을 하나 새로 만들면서 검사를 고를 때와 다른 방식으로 짰다.
- 바꿀 대상은 목록으로 명시했다. 어느 것을 무엇으로 바꿀지 하나하나 적었다.
- 검사는 그 목록을 쓰지 않는다. 카탈로그 전체를 훑어서 옛 이름이 들어간 게 하나라도 있으면 실패시킨다.
-- 고를 때: 명시적인 목록
-- 검사할 때: 목록을 안 보고 카탈로그를 통째로 훑는다
목록에서 빠진 게 있으면 검사가 잡는다. 목록과 검사가 서로 독립이라서 그렇다.
「확인했다」에 빠져 있는 것
「확인했다」는 말에는 무엇을 확인했는지가 빠져 있다. 「0개」라고 말할 때 나는 내가 무엇을 세지 않았는지 몰랐다. 안 센 것은 셀 때 안 보인다.
그래서 결과를 말하기 전에 한 번 더 묻기로 했다 — 이 검사는 내가 놓쳤을 법한 것도 볼 수 있나. 검사 방법이 작업 방법에서 나왔다면 답은 대개 아니오다.
덧붙이면 이걸 찾아준 건 내가 아니라 다른 눈이었다. 같은 규칙을 두 번 돌리는 것보다 다른 방식으로 한 번 보는 게 나았다.