Security Policy 是執行階段真正會強制套用的規則,不是只提醒 Agent「最好這樣做」的提示。查詢與 DML 執行流程,以及執行階段限制器,都會讀取目前的政策設定。
hs-sql-agent 政策欄位
| 欄位 | 預設值 | 有效範圍 / 意義 |
|---|---|---|
QueryMaxRows | 1000 | 1–100,000 |
QueryTimeoutSeconds | 30 | 1–600 秒 |
RequireWhereForUpdate | true | UPDATE 必須有條件 |
RequireWhereForDelete | true | DELETE 必須有條件 |
AllowFullTableUpdate | false | 是否明確允許全表 UPDATE |
AllowFullTableDelete | false | 是否明確允許全表 DELETE |
DmlMaxAffectedRows | 100 | 1–1,000,000 |
KeyPermitLimit | 120 | 每個設定的金鑰時間視窗可允許 1–1,000,000 個請求 |
KeyWindowSeconds | 60 | 1–86,400 秒 |
MaxConcurrentSql | 16 | 同時執行 1–10,000 個 SQL 操作 |
Service 對超出範圍的值會直接拒絕,不會悄悄修正成另一組政策設定。
管理端授權
| 操作 | 權限 |
|---|---|
| 讀取目前政策 | /runtime/security → view |
| 更新政策 | /runtime/security → edit |
政策更新會寫入稽核事件,並立即取代執行階段中的目前政策狀態;同時透過設定的 security-policy synchronization provider 發布變更,讓分散式部署可以把新政策同步到其他執行個體。
查詢限制
QueryMaxRows 透過編譯器與執行階段政策限制查詢輸出;QueryTimeoutSeconds 則控制查詢執行的逾時規則。這些都是伺服器端強制條件,不依賴用戶端自行記得加入 LIMIT 或送出取消要求。
UPDATE / DELETE 條件
預設政策要求 UPDATE / DELETE 必須有條件,並拒絕全表修改。
允許全表修改應該是明確的安全決策:關閉 RequireWhereForUpdate,不等於已經表達「允許全表 UPDATE」的相同安全意圖。除非實際流程確實需要大範圍修改,否則建議保留較保守的預設值。
DML 影響資料列上限
DmlMaxAffectedRows 用來限制單次資料修改的影響範圍,但它只是一層保護措施,不會取代 Safe DML 協定。資料修改仍必須成功完成解析、驗證與編譯;透過 MCP 執行的 DML 還必須完成人工核准,以及提交前的重新驗證。
請見 Safe DML。
MCP 金鑰速率限制
安全政策提供每把金鑰的預設請求上限與時間視窗。個別 MCP 金鑰可以:
- 繼承政策;
- 使用自訂覆寫值;
- 明確設定為不限速。
金鑰層級的模式請見 MCP 金鑰。
SQL 並行執行
MaxConcurrentSql 是執行階段的 SQL 並行執行上限。這個限制只作用在單一程序內,或能跨執行個體協調,取決於目前設定的 SQL concurrency provider。
如果叢集需要讓整個部署共用同一個上限,就應使用 distributed provider,而不是讓每個節點各自擁有完整配額。