跳到主要内容

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_tootrue = 同时删修改记录历史; 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_ARGUMENTstart >= end
DARRA_INVALID_ARGUMENTnode_id 含 NUL

下一步