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); var baseTagSet = baseTags.ToHashSet(StringComparer.OrdinalIgnoreCase);
if (baseTagSet.Count == 0) return 0; 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 조회 ────────────────── // ── Step 1: node_map_master에서 실제 node_id 조회 ──────────────────
// hostname을 직접 조성하지 않고 DB에 저장된 원본 node_id를 사용 // hostname을 직접 조성하지 않고 DB에 저장된 원본 node_id를 사용
var masterNodes = await _ctx.NodeMapMasters var masterNodes = await _ctx.NodeMapMasters

View File

@@ -686,7 +686,7 @@
태그의 desc, area, state descriptor 정보를 OPC UA에서 조회하여 저장합니다. 태그의 desc, area, state descriptor 정보를 OPC UA에서 조회하여 저장합니다.
</p> </p>
<div class="btn-row"> <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> <button class="btn-b" onclick="metaView()">📋 메타데이터 조회</button>
</div> </div>
<div id="meta-log" class="logbox hidden" style="margin-top:8px"></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'); const logEl = document.getElementById('meta-log');
logEl.classList.remove('hidden'); logEl.classList.remove('hidden');
logEl.innerHTML = '<div class="ll inf">⏳ 메타데이터 재로드 중...</div>'; logEl.innerHTML = '<div class="ll inf">⏳ 메타데이터 갱신 중...</div>';
try { try {
const d = await api('POST', '/api/tags/metadata/reload', body); 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>`; logEl.innerHTML = `<div class="ll ${d.success ? 'ok' : 'err'}">${d.success ? '✅' : '❌'} ${esc(d.message)}</div>`;