---
name: feedback_prod_db_verify_integrated_auth
description: Verify DB prod dùng sqlcmd -E (integrated auth) qua ssh — runbook ghi đường mật-khẩu nhưng biến env TRỐNG trong phiên ssh; đừng đi tìm credential
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 8db6a47b-a6fc-4268-a9df-266308bb2d03
  modified: 2026-08-06T09:10:10.756Z
---

Xác minh schema/dữ-liệu **prod** sau deploy: dùng **integrated auth**, KHÔNG dùng mật khẩu.

```
ssh vietreport-vps 'sqlcmd -S .\SQLEXPRESS -d SolutionErp -E -Q "SET NOCOUNT ON; SELECT ..."'
```

**Why:** `.claude/agents/cicd-monitor.md` ghi biến thể `-U vrapp -P '$env:PROD_DB_PASSWORD'`. Đo @S177: biến đó **TRỐNG trong phiên ssh** (chỉ sống ở context khác), nên lệnh runbook trả `Login failed for user 'vrapp'`. Thêm nữa, viết `$env:...` trong single-quote của bash thì PowerShell remote KHÔNG giãn — sqlcmd nhận đúng mấy chữ đó làm mật khẩu. Cờ `-E` bỏ qua cả hai vấn đề.

**How to apply:** cần đọc prod DB (verify migration đã áp · đếm dòng backfill · soi cột mới) ⇒ dùng `-E` ngay từ đầu. Env-var trống **KHÔNG** phải tín hiệu đi tìm credential — credential là thứ CẤM lục; đổi sang đường không cần credential. Cặp verify sau deploy: `__EFMigrationsHistory` dòng đầu = migration vừa ship, RỒI đếm dữ-liệu thật để chứng backfill có ăn (xem [[feedback_mechanism_right_data_absent]] — cơ-chế đúng ≠ dữ-liệu có). Vế artifact FE đo riêng theo [[feedback_verify_deployed_artifact_byte_level]].

🔴 **Verify thay-đổi BACKEND đã live (bundle FE KHÔNG nói gì về BE)** — grep chuỗi trong DLL đã deploy, đúng khuôn byte-level của FE. Đổi 1 **string literal** kèm bản vá (vd thông-điệp `ConflictException`) rồi soi nó:
```
ssh vietreport-vps '$b=[IO.File]::ReadAllBytes("C:\inetpub\solution-erp\api\SolutionErp.Application.dll")
  $u8=[Text.Encoding]::UTF8.GetString($b)                      # heap #Strings = tên kiểu/thành-viên
  $ea=[Text.Encoding]::Unicode.GetString($b)                   # heap #US = literal, khung CHẴN
  $eb=[Text.Encoding]::Unicode.GetString($b,1,$b.Length-1)     # ... khung LẺ'
```
3 bẫy đã sập THẬT @S177, mỗi cái đều trả `False` trông y như *"BE chưa deploy"*:
1. **Decode sai heap** — tên kiểu là **UTF-8**, literal là **UTF-16**; dùng 1 kiểu decode thì control ASCII cũng `False`.
2. **Lệch khung UTF-16** — literal bắt đầu ở offset LẺ thì decode-cả-file trượt ⇒ phải thử **CẢ 2 khung**.
3. **Quoting** — ký tự có dấu bị mangle qua ssh ⇒ dựng pattern **trên máy remote** từ code-point (`[char]0x1EA3`); và PowerShell **không** thoát nháy bằng `\"` (dùng backtick / nháy đôi).

🔴 **LUẬT CỨU MẠNG rút ra: mỗi phép đo phải kèm CONTROL DƯƠNG** — một chuỗi **phải đúng dù bản vá có hay không**. Control `False` ⇒ hỏng **cái thước**, không phải cái được đo. Thiếu nó thì *đo hỏng* và *deploy hỏng* trông giống hệt nhau (cùng gốc [[feedback_claim_stronger_than_work]] "0-hit kèm control-dương", và [[feedback_absence_looks_like_clean]]). Bộ đủ = 2 control dương + chuỗi-MỚI `True` + chuỗi-CŨ `False`.

🔴 **Bundle CŨ không dùng làm đối-chứng byte-level được**: deploy dọn `dist` nên URL asset cũ trả ~900B SPA-fallback, không phải JS. Đối-chứng đúng = **dist local của CHÍNH app đó** (mỗi app so với dist của nó — fe-admin ⟂ fe-user có nội dung khác nhau, so chéo là ra "lệch" giả).
