# 함수 명세: `publishDdsPlan` 및 `verifyDdsIsolation` (#617)

> **상태**: Draft · **분류**: 보호 Object provisioning·검증·드리프트

## 책임

승인된 Object/CRUD/컬럼 그룹 provisioning DDL을 멱등 실행하고, dictionary와 representative END USER matrix로 실제 결과를 확인한다. 권한 값 변경 자체는 이 함수를 호출하지 않는다.

## 시그니처

- `DdsPublishPlan, Reason -> DdsPublishRun`
- `DdsPublishRun -> DdsVerificationResult`

## 게시 규칙

1. 승인 사유와 diff fingerprint가 없으면 게시하지 않는다.
2. Publisher lock으로 같은 보호 객체의 동시 provisioning을 막는다.
3. 공통 Data Role, 신규 END USER, 함수 prerequisite, Data Grant를 dependency 순서로 적용한다.
4. 각 DDL 결과와 Oracle 오류를 `DdsPublishRun`에 기록한다.
5. 중간 실패 시 성공으로 표시하지 않는다. 부분 적용 상태로 기록하고 drift로 승격한다.

## 검증 규칙

1. `DBA_END_USERS`, `DBA_DATA_ROLES`, `DBA_DATA_ROLE_GRANTS`, `DBA_DATA_GRANTS`를 목표 fingerprint와 비교한다.
2. 대표 사용자별 Context, 객체 접근, 행, 컬럼 결과를 검증한다.
3. 권한 테이블의 ALLOW/DENY·역할 변경이 DDL 없이 다음 SQL에 반영되는지 검증한다.
4. Context attach/clear 격리 검증이 실패하면 publish 결과를 정상으로 표시하지 않는다.

## 실패

게시·검증 실패는 `FAILED` 또는 `DRIFT` 상태다. MCP 요청 경로는 마지막 성공 게시 상태를 우회 권한으로 사용하지 않는다.
