마이그레이션
This commit is contained in:
parent
04b7897904
commit
8682c7e7c6
3 changed files with 130 additions and 0 deletions
92
MIGRATE_V2_FIN.php
Normal file
92
MIGRATE_V2_FIN.php
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Synology Autonomous Architect - Database Migration Script
|
||||||
|
* Target: laptop_assets table enhancement for 'Disposed' and 'Stock' status logic.
|
||||||
|
* Date: 2026-03-04
|
||||||
|
*/
|
||||||
|
|
||||||
|
header('Content-Type: text/plain; charset=utf-8');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 1. DB 연결 (절대 경로 보장)
|
||||||
|
$dbPath = __DIR__ . DIRECTORY_SEPARATOR . 'assets.db';
|
||||||
|
if (!file_exists($dbPath)) {
|
||||||
|
throw new Exception("데이터베이스 파일({$dbPath})을 찾을 수 없습니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = new PDO("sqlite:$dbPath");
|
||||||
|
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
|
||||||
|
echo "--- [마이그레이션 시작] 노트북 자산 관리 시스템 v2 ---\n\n";
|
||||||
|
|
||||||
|
// 2. 백업 생성 (안전을 위한 rsync 성격의 파일 복사)
|
||||||
|
$backupPath = $dbPath . '.bak_' . date('Ymd_His');
|
||||||
|
if (!copy($dbPath, $backupPath)) {
|
||||||
|
throw new Exception("데이터베이스 백업 생성 실패");
|
||||||
|
}
|
||||||
|
echo "🛡️ 데이터 안전: 원본 백업이 생성되었습니다. ($backupPath)\n";
|
||||||
|
|
||||||
|
// 3. 스키마 확장 (컬럼 추가)
|
||||||
|
$newColumns = [
|
||||||
|
'real_user' => 'TEXT',
|
||||||
|
'disposal_user_id' => 'INTEGER'
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($newColumns as $col => $type) {
|
||||||
|
try {
|
||||||
|
$db->exec("ALTER TABLE laptop_assets ADD COLUMN $col $type");
|
||||||
|
echo "✅ 컬럼 추가 성공: $col\n";
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
if (strpos($e->getMessage(), 'duplicate column name') !== false) {
|
||||||
|
echo "ℹ️ 이미 존재함: $col (스키마 유지)\n";
|
||||||
|
} else {
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 데이터 정합성 마이그레이션 - STOCK 상태 자산 명칭 동기화
|
||||||
|
// 기존에 STOCK 상태인 모든 자산의 배정사용자를 '업무용(TEMP_44666b)'으로 통합
|
||||||
|
$stmtStock = $db->prepare("
|
||||||
|
UPDATE laptop_assets
|
||||||
|
SET assigned_user_name = '업무용(TEMP_44666b)',
|
||||||
|
current_user_id = NULL
|
||||||
|
WHERE status = 'stock'
|
||||||
|
AND (assigned_user_name != '업무용(TEMP_44666b)' OR assigned_user_name IS NULL)
|
||||||
|
");
|
||||||
|
$stmtStock->execute();
|
||||||
|
$affectedStock = $stmtStock->rowCount();
|
||||||
|
echo "✅ 데이터 동기화: STOCK 자산 $affectedStock 건의 입력을 '업무용(TEMP_44666b)'으로 통일했습니다.\n";
|
||||||
|
|
||||||
|
// 5. 데이터 정합성 마이그레이션 - 매각 대상자 ID 복구
|
||||||
|
// 기존 매각 대상자 이름(disposal_recipient)이 직원 리스트에 있다면 ID를 찾아 매핑
|
||||||
|
$allDisposed = $db->query("
|
||||||
|
SELECT id, disposal_recipient
|
||||||
|
FROM laptop_assets
|
||||||
|
WHERE status = 'disposed'
|
||||||
|
AND disposal_recipient IS NOT NULL
|
||||||
|
AND disposal_user_id IS NULL
|
||||||
|
")->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
$idRestored = 0;
|
||||||
|
$userFinder = $db->prepare("SELECT id FROM users WHERE name = ? LIMIT 1");
|
||||||
|
$idUpdater = $db->prepare("UPDATE laptop_assets SET disposal_user_id = ? WHERE id = ?");
|
||||||
|
|
||||||
|
foreach ($allDisposed as $row) {
|
||||||
|
$userFinder->execute([$row['disposal_recipient']]);
|
||||||
|
$uid = $userFinder->fetchColumn();
|
||||||
|
if ($uid) {
|
||||||
|
$idUpdater->execute([$uid, $row['id']]);
|
||||||
|
$idRestored++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo "✅ 데이터 정합성: DISPOSED 자산 $idRestored 건의 사번 ID를 자동 매핑했습니다.\n\n";
|
||||||
|
|
||||||
|
echo "--- [마이그레이션 완료] 시스템이 정상적으로 업데이트되었습니다. ---\n";
|
||||||
|
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo "\n❌ [마이그레이션 실패] 오류 내용: " . $e->getMessage() . "\n";
|
||||||
|
if (isset($backupPath) && file_exists($backupPath)) {
|
||||||
|
echo "⚠️ 주의: 원본 데이터가 손상되었을 수 있으므로 백업 파일($backupPath)을 확인하십시오.\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
assets.db
BIN
assets.db
Binary file not shown.
38
migrate_data_v2.php
Normal file
38
migrate_data_v2.php
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
try {
|
||||||
|
$db = new PDO('sqlite:d:\Docker\jasan\assets.db');
|
||||||
|
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
|
||||||
|
echo "--- 🛠 데이터 일관성 점검 및 마이그레이션 중... ---\n";
|
||||||
|
|
||||||
|
// 1. 재고(STOCK) 상태인 자산의 배정사용자를 '업무용(TEMP_44666b)'으로 통합
|
||||||
|
// 기존에 비어있거나 다른 이름이었던 경우 업데이트
|
||||||
|
$stmt1 = $db->prepare("UPDATE laptop_assets
|
||||||
|
SET assigned_user_name = '업무용(TEMP_44666b)', current_user_id = NULL
|
||||||
|
WHERE status = 'stock' AND (assigned_user_name != '업무용(TEMP_44666b)' OR assigned_user_name IS NULL)");
|
||||||
|
$stmt1->execute();
|
||||||
|
echo "✅ 재고(STOCK) 자산의 배정사용자명을 '업무용(TEMP_44666b)'으로 동기화함. (수정건수: " . $stmt1->rowCount() . "건)\n";
|
||||||
|
|
||||||
|
// 2. 매각 대상자 ID 복구 시도 (문자열 이름 -> 정수 ID)
|
||||||
|
// 기존 disposal_recipient에 이름이 있는 경우 users 테이블과 대조하여 disposal_user_id 채우기
|
||||||
|
$allDisposed = $db->query("SELECT id, disposal_recipient FROM laptop_assets WHERE status = 'disposed' AND disposal_recipient IS NOT NULL AND disposal_user_id IS NULL")->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
$restoredCount = 0;
|
||||||
|
$userFinder = $db->prepare("SELECT id FROM users WHERE name = ? LIMIT 1");
|
||||||
|
$idUpdater = $db->prepare("UPDATE laptop_assets SET disposal_user_id = ? WHERE id = ?");
|
||||||
|
|
||||||
|
foreach ($allDisposed as $row) {
|
||||||
|
$userFinder->execute([$row['disposal_recipient']]);
|
||||||
|
$uid = $userFinder->fetchColumn();
|
||||||
|
if ($uid) {
|
||||||
|
$idUpdater->execute([$uid, $row['id']]);
|
||||||
|
$restoredCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo "✅ 매각 자산의 대상자 ID(disposal_user_id)를 사내 직원 데이터와 대조하여 복구함. (복구건수: $restoredCount 건)\n";
|
||||||
|
|
||||||
|
echo "--- 🎉 완료되었습니다. ---";
|
||||||
|
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo "❌ 오류: " . $e->getMessage() . "\n";
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue