fix: tag_metadata orphan cleanup on metadata reload

This commit is contained in:
windpacer
2026-05-11 22:02:29 +09:00
parent 5cacc5dbb5
commit ab290df5cd
3 changed files with 9 additions and 2 deletions

View File

@@ -37,6 +37,13 @@ public class MetadataLoaderService : IMetadataLoaderService
var baseTagSet = baseTags.ToHashSet(StringComparer.OrdinalIgnoreCase);
if (baseTagSet.Count == 0) return 0;
// ── Step 0: realtime_table에 없는 orphan base_tag 삭제 ─────────────
await _ctx.Database.ExecuteSqlRawAsync(@"
DELETE FROM tag_metadata
WHERE base_tag NOT IN (
SELECT DISTINCT LOWER(split_part(tagname, '.', 1)) FROM realtime_table
)");
// ── Step 1: node_map_master에서 실제 node_id 조회 ──────────────────
// hostname을 직접 조성하지 않고 DB에 저장된 원본 node_id를 사용
var masterNodes = await _ctx.NodeMapMasters

View File

@@ -686,7 +686,7 @@
태그의 desc, area, state descriptor 정보를 OPC UA에서 조회하여 저장합니다.
</p>
<div class="btn-row">
<button class="btn-a" onclick="metaReload()">🔄 메타데이터 로드</button>
<button class="btn-a" onclick="metaReload()">🔄 메타데이터 갱신</button>
<button class="btn-b" onclick="metaView()">📋 메타데이터 조회</button>
</div>
<div id="meta-log" class="logbox hidden" style="margin-top:8px"></div>

View File

@@ -954,7 +954,7 @@ async function metaReload() {
};
const logEl = document.getElementById('meta-log');
logEl.classList.remove('hidden');
logEl.innerHTML = '<div class="ll inf">⏳ 메타데이터 재로드 중...</div>';
logEl.innerHTML = '<div class="ll inf">⏳ 메타데이터 갱신 중...</div>';
try {
const d = await api('POST', '/api/tags/metadata/reload', body);
logEl.innerHTML = `<div class="ll ${d.success ? 'ok' : 'err'}">${d.success ? '✅' : '❌'} ${esc(d.message)}</div>`;