168 lines
9.2 KiB
HTML
168 lines
9.2 KiB
HTML
<!doctype html>
|
|
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
|
|
<head th:replace="~{fragments/layout :: head('조회 대상')}"></head>
|
|
<body>
|
|
<nav th:replace="~{fragments/layout :: nav}"></nav>
|
|
<main class="container py-4">
|
|
<div class="page-title">
|
|
<h1>조회 대상</h1>
|
|
<details class="explanation-details">
|
|
<summary>도움말</summary>
|
|
<p>이 화면은 DB 객체를 HTTP로 연결할 경로만 등록합니다. 누가 어떤 행을 볼 수 있는지는 행 접근 규칙과 Oracle VPD 정책에서 결정합니다.</p>
|
|
</details>
|
|
</div>
|
|
|
|
<div class="alert alert-info">
|
|
<strong>지식 검색 연결:</strong> 문서 검색 단위와 기술 태그를 등록한 뒤 전용 ORDS 검색을 연결합니다.
|
|
<details class="explanation-details mt-2">
|
|
<summary>지식 검색 연결 흐름 보기</summary>
|
|
<p>문서를 검색 단위로 나누고 기술 태그를 붙인 뒤 전용 ORDS 검색을 등록합니다. 그 다음 <a href="/permissions">행 접근 규칙</a>에서 <code>특정 기술 태그</code>를 여러 개 추가하면 태그 중 하나라도 맞는 검색 단위만 검색됩니다.</p>
|
|
</details>
|
|
</div>
|
|
|
|
<div class="alert alert-success" th:if="${message}" th:text="${message}"></div>
|
|
<div class="alert alert-danger" th:if="${errorMessage}" th:text="${errorMessage}"></div>
|
|
|
|
<section class="content-band">
|
|
<h2>조회 대상 추가</h2>
|
|
<p class="section-subtitle">DB 객체 하나를 하나의 조회 Handler로 연결하는 기본 구성입니다.</p>
|
|
<details class="explanation-details">
|
|
<summary>대상 추가 후 생성되는 내용 보기</summary>
|
|
<p>대상 추가 후 Handler를 생성하면 행 접근 context 설정과 기본 SELECT가 포함된 PL/SQL이 만들어집니다. 소스 보기에서 실제 업무에 맞게 수정할 수 있습니다.</p>
|
|
</details>
|
|
<form method="post" action="/objects" class="form-grid">
|
|
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
|
|
<input type="hidden" name="owner" required>
|
|
<input type="hidden" name="objectName" required>
|
|
<label>
|
|
DB 객체 선택
|
|
<select class="form-select" id="objectCatalogSelect" required>
|
|
<option value="">선택하세요</option>
|
|
<option th:each="dbObject : ${dbObjects}"
|
|
th:value="${dbObject.value()}"
|
|
th:data-owner="${dbObject.owner()}"
|
|
th:data-object-name="${dbObject.objectName()}"
|
|
th:text="${dbObject.label()}"></option>
|
|
</select>
|
|
</label>
|
|
<label>
|
|
ORDS Path (자동)
|
|
<input class="form-control" name="ordsPath" data-ords-path-input
|
|
placeholder="DB 객체 선택 시 자동 입력" readonly required>
|
|
<span class="form-hint">
|
|
객체를 선택하면 기본 module/template 경로가 자동으로 입력됩니다. 비워 제출해도 서버가 같은 규칙으로 채웁니다.
|
|
<label class="form-check form-check-inline ms-2">
|
|
<input class="form-check-input" type="checkbox" data-ords-path-edit>
|
|
<span class="form-check-label">고급: 직접 수정</span>
|
|
</label>
|
|
</span>
|
|
</label>
|
|
<label>
|
|
조회 대상 설명
|
|
<input class="form-control" name="description" maxlength="200"
|
|
placeholder="예: 기술 태그 권한이 적용된 지식자료 검색">
|
|
</label>
|
|
<button class="btn btn-primary" type="submit">대상 추가</button>
|
|
</form>
|
|
<details class="explanation-details explanation-warning mt-3">
|
|
<summary>기본 Handler 구성과 수정 가이드 보기</summary>
|
|
<p><code>cb_ords_handler_pkg.set_vpd_context(:auth_header, :probe_id)</code>로 토큰의 사용자·역할 컨텍스트와 검증 요청 식별자를 넣고, 선택한 한 테이블에 <code>SELECT ... FROM OWNER.TABLE</code>을 실행한 뒤 JSON으로 반환합니다. 이것은 유일한 사용 방식이 아니라 시작점이며, Handler 소스와 ORDS 메타데이터에서 수정할 수 있습니다. 컬럼 민감도·마스킹은 이 화면에서 다루지 않고 <a href="/masking-rules">컬럼 마스킹</a>에서 별도로 설정합니다.</p>
|
|
</details>
|
|
</section>
|
|
|
|
<section class="content-band">
|
|
<div class="section-heading">
|
|
<div>
|
|
<h2>조회 대상 목록</h2>
|
|
<p class="section-subtitle">ORDS Path와 Handler 상태를 관리합니다. 접근 권한은 이 표에서 만들지 않습니다.</p>
|
|
</div>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table table-sm align-middle">
|
|
<thead>
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>Owner</th>
|
|
<th>Object</th>
|
|
<th>설명</th>
|
|
<th>ORDS Path</th>
|
|
<th>Action</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<th:block th:each="object : ${objects}">
|
|
<tr>
|
|
<td th:text="${object.objectId()}">1</td>
|
|
<td th:text="${object.owner()}">ADMIN</td>
|
|
<td th:text="${object.objectName()}">CB_V_SEARCH_DOCUMENTS</td>
|
|
<td>
|
|
<form method="post" action="/objects/description" class="inline-form">
|
|
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
|
|
<input type="hidden" name="objectId" th:value="${object.objectId()}">
|
|
<input class="form-control form-control-sm" name="description" maxlength="200"
|
|
th:value="${object.description()}" placeholder="짧은 설명">
|
|
<button class="btn btn-sm btn-outline-primary" type="submit">저장</button>
|
|
</form>
|
|
<small class="text-muted" th:text="${object.descriptionOrDefault()}">조회 대상 설명</small>
|
|
</td>
|
|
<td>
|
|
<form method="post" action="/objects/ords-path" class="inline-form">
|
|
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
|
|
<input type="hidden" name="objectId" th:value="${object.objectId()}">
|
|
<input class="form-control form-control-sm" name="ordsPath" th:value="${object.ordsPath()}" required>
|
|
<button class="btn btn-sm btn-outline-primary" type="submit">저장</button>
|
|
</form>
|
|
</td>
|
|
<td>
|
|
<div class="action-stack" th:if="${object.objectName() == 'CB_VECTOR_SEARCH_DOCUMENTS'}">
|
|
<span class="text-info small">전용 벡터 Handler 사용<br>(SQL 29, EMBEDDING 미노출)</span>
|
|
</div>
|
|
<div class="action-stack" th:unless="${object.objectName() == 'CB_VECTOR_SEARCH_DOCUMENTS'}">
|
|
<form method="post" action="/objects/ords-handler" class="inline-form">
|
|
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
|
|
<input type="hidden" name="objectId" th:value="${object.objectId()}">
|
|
<button class="btn btn-sm btn-outline-primary" type="submit">Handler 생성</button>
|
|
</form>
|
|
<button class="btn btn-sm btn-outline-secondary"
|
|
type="button"
|
|
th:hx-get="@{/objects/ords-handler-source(objectId=${object.objectId()})}"
|
|
th:hx-target="${'#handler-source-' + object.objectId()}"
|
|
hx-swap="innerHTML">소스 보기</button>
|
|
<form method="post" action="/objects/disable" class="inline-form">
|
|
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
|
|
<input type="hidden" name="objectId" th:value="${object.objectId()}">
|
|
<button class="btn btn-sm btn-outline-danger" type="submit">비활성화</button>
|
|
</form>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="6" class="policy-source-cell">
|
|
<details class="explanation-details">
|
|
<summary>이 대상의 자동 연결 흐름 보기</summary>
|
|
<div class="object-handler-explainer">
|
|
<strong>토큰 헤더 → 행 접근 context 설정 → 선택한 단일 테이블의 기본 SELECT → JSON 응답</strong>
|
|
<small>행 접근은 행 접근 규칙과 Oracle VPD 정책이 담당합니다. 컬럼 원문/마스킹은 컬럼 마스킹의 ASO/Data Redaction 설정에서 관리하세요.</small>
|
|
</div>
|
|
</details>
|
|
<div th:if="${object.objectName() != 'CB_VECTOR_SEARCH_DOCUMENTS'}"
|
|
th:id="${'handler-source-' + object.objectId()}" class="text-muted small">
|
|
소스 보기를 누르면 기본 Handler PL/SQL이 표시됩니다.
|
|
</div>
|
|
<div th:if="${object.objectName() == 'CB_VECTOR_SEARCH_DOCUMENTS'}" class="text-muted small">
|
|
전용 벡터 검색 Handler는 SQL 29에서 등록합니다.
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</th:block>
|
|
<tr th:if="${#lists.isEmpty(objects)}">
|
|
<td colspan="6" class="text-muted">등록된 조회 Handler 대상이 없습니다.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</body>
|
|
</html>
|