現象
- 程式碼執行 `ExecuteNonQuery` 回傳 `1` (影響 1 列)。
- 查詢操作正常,但 `INSERT`/`UPDATE`/`DELETE` **資料庫實際未變更**。
- 無例外拋出。
核心原因
**資料庫連線使用者帳號僅具備 `SELECT` 權限,缺乏 `INSERT`/`UPDATE`/`DELETE` 權限。**
- ADO.NET `ExecuteNonQuery` 回傳「受影響列數」由伺服器回報。
- 若觸發器 (`INSTEAD OF TRIGGER`) 截獲操作並不實際寫入,仍可能回傳 >0。
- 若為權限不足,SQL Server 通常拋出例外,**但某些情境 (如透過視圖、觸發器、權限模糊) 可能靜默失敗**。
排查步驟
- **SSMS 以相同帳號登入**,手動執行 `INSERT` 語句,觀察是否報錯或成功。
- 檢查使用者權限:
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
- 確認連線字串 `Integrated Security=True` (Windows 驗證) 或 SQL 帳號密碼正確。
- 檢查是否有 `INSTEAD OF INSERT` 觸發器攔截並忽略操作。
- 啟用 SQL Profiler / Extended Events 追蹤實際執行的 SQL 與錯誤。
修正
授予該使用者 `db_datawriter` 角色或明確 `GRANT INSERT, UPDATE, DELETE ON table TO user;`。