delete_history_range
按时间区间删除历史数据 (DeleteRawModifiedDetails).
法规约束
数据删除是高敏感操作, 多数行业法规 (GMP / FDA / ISO) 要求"永不删除"或"删除必须留审计". 服务端实现可能加额外保护.
签名
pub fn Session::delete_history_range(
&self,
node_id: &str,
start: SystemTime,
end: SystemTime,
delete_modified_too: bool,
) -> Result<StatusCode, OpcUaError>;
| 参数 | 说明 |
|---|---|
node_id | 目标 NodeId |
start / end | 删除区间 (UTC) |
delete_modified_too | true = 同时删修改记录历史; false = 只删原始, 保留修改记录 |
用法
use std::time::{Duration, SystemTime};
let now = SystemTime::now();
let one_month_ago = now - Duration::from_secs(30 * 86400);
let one_week_ago = now - Duration::from_secs(7 * 86400);
// 删除一个月前到一周前的数据 (保留修改记录)
let st = s.delete_history_range(
"ns=2;s=Temperature",
one_month_ago, one_week_ago,
false,
)?;
if !st.is_good() {
eprintln!("Delete failed: {}", st);
}
同时删修改记录
法规允许时, 用 delete_modified_too: true 一并清干净 (空间占用最少, 但失去审计):
s.delete_history_range(
"ns=2;s=Temperature",
one_month_ago, one_week_ago,
true,
)?;
删除指定时间点 (DeleteAtTime)
OPC UA 规范也支持 DeleteAtTime (按离散时间点删), 但当前 SDK 未单独暴露 API. 用法:
走 update_history(node_id, HistoryUpdateType::Remove, &dvs),
dvs 中每个 DataValue 的 source_timestamp 作为待删时间点.
删除事件 (DeleteEvents)
按 EventId 列表删事件, 当前 SDK 未直接暴露 (后续版本扩展). 临时方案:
通过自定义服务端 Method 走 Session::call(...) 实现.
法规约束
数据删除是高敏感操作, 多数行业法规 (GMP / FDA / ISO) 要求:
- 永不删除 (只允许标记 obsolete)
- 删除必须留审计 (谁删的, 何时, 原因)
服务端实现可能加额外保护. 客户端可能拿到 BAD_USER_ACCESS_DENIED.
性能
- 大区间 Delete 服务端可能阻塞数秒到数分钟 (重建索引)
- 长时间操作建议在独立线程执行, 避免阻塞主流程
错误
| StatusCode | 原因 |
|---|---|
BAD_HISTORY_OPERATION_UNSUPPORTED | 服务端不允许删除 |
BAD_USER_ACCESS_DENIED | 无权限 |
BAD_INVALID_ARGUMENT | start >= end |
DARRA_INVALID_ARGUMENT | node_id 含 NUL |