Files
document-haness/docs/TechLog/final/evidence/raw/db/delete-blocked-by-project-link.txt
T

65 lines
3.2 KiB
Plaintext

작업본 삭제를 막는 참조 — 실제 사례와 그 해소
출처: hyeonworks-prod / postgres-0 / appdb
진단 시각: 2026-09-04 (아래 [1]~[4])
사후 확인: 2026-09-04, 사용자가 조치한 뒤 (아래 [5])
증상
「DTO 변환 과정에서 발생한 Highlight 컬렉션 N+1」을 지우려는데, 관계를 다 지웠는데도
삭제가 안 된다.
삭제 가드가 보는 다섯 테이블 (DeleteDocumentDraftUseCase → documentReferenced)
SELECT 1 FROM document_relation WHERE target_document_id = :id
UNION ALL SELECT 1 FROM question_document_link WHERE document_id = :id
UNION ALL SELECT 1 FROM project_document_link WHERE document_id = :id ← 여기서 걸림
UNION ALL SELECT 1 FROM topic_featured_document WHERE document_id = :id
UNION ALL SELECT 1 FROM project_decision WHERE source_case_id = :id
다섯 이유가 전부 같은 한 문장으로 나온다:
"another record still links to this one; unlink it first"
「another record」라고 하니 관계를 찾아 지우게 되는데, 정작 막는 것은 record 가 아니라
프로젝트 연결이다. 그리고 프로젝트 연결은 「관계」 편집기가 아니라 문서의 Project 필드다.
======================================================================
[1] 대상 문서 (진단 시점 캡처)
58c2d5d9-5865-4b2c-b1cc-3c5c955c33dc | CASE | collection-nplus1-dto-mapping
| DRAFT | PRIVATE | DTO 변환 과정에서 발생한 Highlight 컬렉션 N+1
→ workflow_status=DRAFT, target_visibility=PRIVATE 이고 publication /
public_resource_projection / public_route 에 행이 없다. 즉 게시 가드는 통과한다.
[2] 이 문서 id 를 참조하는 행 — uuid 컬럼 전수 스캔 (진단 시점 캡처)
NOTICE: project_document_link . document_id => 1 행
NOTICE: document . id => 1 행
NOTICE: case_detail . document_id => 1 행
→ 셋뿐이다. document(자신), case_detail(본문), 그리고 project_document_link 1행.
[3] 막고 있는 그 행의 정체 (진단 시점 캡처)
relation_type=PRIMARY | featured_order=- | project=Liner N + 1문제
→ relation_type 이 PRIMARY 이므로 ProjectLinkStore.setPrimary() 의 DELETE 대상이다.
즉 Studio 에서 Project 를 「미지정」으로 바꿔 저장하면 이 행이 지워진다.
(setPrimary 는 relation_type='PRIMARY' 인 행만 지운다. 만약 이 행이 RELATED 였다면
화면에서 풀 방법이 없어 진짜로 막혔을 것이다 — 그 경우는 아니었다.)
[4] document_relation 은 실제로 비어 있었다 (진단 시점 캡처)
document_relation 참조 행 수: 0
→ 사용자가 관계를 다 지운 것이 맞다. 관계는 문제가 아니었다.
======================================================================
[5] 사후 확인 — 사용자가 Project 를 미지정으로 바꾸고 삭제한 뒤
document 행: 0
project_document_link 행: 0
case_detail 행: 0
→ 삭제가 통과했다. 진단이 맞았다는 것이 이것으로 확인된다 — 프로젝트 연결을 푸는 것이
막힘의 해소였다.
주의: 그래서 이 결함은 이제 실시간으로 재현할 수 없다. [1]~[4] 는 진단 당시의 캡처이고
[5] 만 지금 다시 조회한 값이다.