[Developer] #424 tighten VPD LLM explanation prompt

This commit is contained in:
devmrko
2026-06-25 13:43:45 +09:00
parent edf20f10b8
commit f0843957fa

View File

@@ -82,9 +82,10 @@ public class VpdPolicyService {
private String buildExplanationPrompt(VpdPolicyDetail detail, VpdFunctionSource functionSource) { private String buildExplanationPrompt(VpdPolicyDetail detail, VpdFunctionSource functionSource) {
VpdPolicyView policy = detail.policy(); VpdPolicyView policy = detail.policy();
return """ return """
다음 Oracle VPD policy와 policy function source를 근거로 설명해줘. 다음 Oracle VPD policy와 policy function source를 근거로 운영자가 바로 검토할 수 있는 분석 보고서를 작성한다.
일반적인 VPD 설명은 금지한다. 반드시 제공된 source에서 확인되는 변수, SELECT, IF/ELSIF, RETURN predicate만 근거로 설명한다.
Policy Metadata: [입력: Policy Metadata]
- Object: %s - Object: %s
- Policy Group: %s - Policy Group: %s
- Policy Name: %s - Policy Name: %s
@@ -96,18 +97,38 @@ public class VpdPolicyService {
- Static Policy: %s - Static Policy: %s
- Long Predicate: %s - Long Predicate: %s
DBMS_RLS.ADD_POLICY: [입력: DBMS_RLS.ADD_POLICY]
%s %s
Policy Function Source: [입력: Policy Function Source]
%s %s
답변 요구사항: [출력 형식]
1. 정책 적용 범위
- 대상 객체, 적용 SQL, enabled 여부를 한 문단으로 설명한다.
2. 필터 함수 입력과 조회 값
- source에서 읽어오는 context/user/role/permission/rule 값을 bullet로 정리한다.
- 각 항목 옆에 source 근거를 짧게 적는다. 예: "v_user_id: SYS_CONTEXT(...)"
3. Predicate 생성 분기
- source의 RETURN 값을 기준으로 분기별 표를 만든다.
- 컬럼은 "조건", "반환 predicate", "의미", "보이는 행/차단되는 행"으로 한다.
- '1=0' 같은 fail-closed predicate가 있으면 반드시 명시한다.
4. 실제 접근 결과 해석
- 이 policy가 행(row)을 허용하는 조건과 제외하는 조건을 구분한다.
- 컬럼 마스킹/NULL 처리는 source에 직접 있지 않으면 "이 policy source만으로는 판단 불가"라고 쓴다.
5. 운영 확인 포인트
- 운영자가 DB에서 확인할 테이블/컬럼/컨텍스트 값을 5개 이하로 적는다.
[엄격한 규칙]
- 한국어로 답변한다. - 한국어로 답변한다.
- 이 policy가 어느 객체의 어떤 SQL 동작에 적용되는지 설명한다. - source에 없는 테이블, 컬럼, role 이름을 만들지 않는다.
- filter predicate가 어떤 조건을 만들고 어떤 행이 보이거나 제외되는지 설명한다. - source 근거가 부족하면 추측하지 말고 "source만으로는 판단 불가"라고 쓴다.
- source에 명시되지 않은 동작은 추측하지 않는다. - "일반적으로", "보통", "아마" 같은 표현을 쓰지 않는다.
- 운영자가 확인할 포인트를 짧게 정리한다. - 답변은 80줄 이내로 유지한다.
""".formatted( """.formatted(
policy.objectDisplayName(), policy.objectDisplayName(),
policy.policyGroup(), policy.policyGroup(),
@@ -126,8 +147,10 @@ public class VpdPolicyService {
private String vpdSystemPrompt() { private String vpdSystemPrompt() {
return """ return """
당신은 Oracle ADB VPD(DBMS_RLS), RLS policy function, ORDS 권한 검증을 설명하는 보조자입니다. 당신은 Oracle ADB VPD(DBMS_RLS) policy function을 리뷰하는 데이터 보안 엔지니어입니다.
제공된 policy metadata와 source만 근거로 설명하고, 없는 정보를 추측하지 마세요. 목표는 운영자가 실제 filter predicate 동작을 검증할 수 있게 source 기반으로 설명하는 것입니다.
제공된 policy metadata와 source만 근거로 판단하고, source에 없는 업무 규칙이나 테이블 의미를 추측하지 마세요.
가능하면 source의 변수명, SELECT 대상, RETURN predicate를 그대로 언급하세요.
"""; """;
} }