// extension 으로 모든 query 에 자동 필터
constprisma=newPrismaClient().$extends({query:{user:{asyncfindMany({args,query}){args.where={...args.where,deletedAt: null};returnquery(args);},asyncfindUnique({args,query}){args.where={...args.where,deletedAt: null};returnquery(args);},},},});
CREATEVIEWv_usersASSELECT*FROMusersWHEREdeleted_atISNULL;-- 앱은 v_users 만 사용, 직접 users 접근 금지
Cascade soft delete
-- user 삭제 시 그의 posts 도 soft delete
WITHdeleted_userAS(UPDATEusersSETdeleted_at=NOW()WHEREid=$1RETURNINGid)UPDATEpostsSETdeleted_at=NOW()WHEREuser_idIN(SELECTidFROMdeleted_user)ANDdeleted_atISNULL;
진짜 영구 삭제 (GDPR)
-- 1년 전 soft-deleted 는 hard delete
DELETEFROMusersWHEREdeleted_at<NOW()-INTERVAL'1 year';