各位开发者们好,
InterSystems IRIS 数据平台的最大特点之一是它允许您创建自己的自定义,您可以使用InterSystems IRIS 中支持的所有其他模型,例如对象和关系结构,而无需创建任何自定义结构。
⏯ InterSystems Globals与灵活的数据建模 Globals
各位开发者们好,
InterSystems IRIS 数据平台的最大特点之一是它允许您创建自己的自定义,您可以使用InterSystems IRIS 中支持的所有其他模型,例如对象和关系结构,而无需创建任何自定义结构。
⏯ InterSystems Globals与灵活的数据建模 Globals
将字符串重复指定次数的字符串函数。
REPEAT(expression,repeat-count)
{fn REPEAT(expression,repeat-count)}
expression - 要重复的字符串表达式。repeat-count - 重复的次数,以整数表示。REPEAT 返回一串重复计数的表达式实例,连接在一起。
如果表达式为 NULL,则 REPEAT 返回 NULL。如果 expression 是空字符串,则 REPEAT 返回一个空字符串。
如果重复计数是小数,则仅使用整数部分。如果重复计数为 0,则 REPEAT 返回一个空字符串。如果重复计数是负数、NULL 或非数字字符串,则 REPEAT 返回 NULL。
以下示例显示了 REPEAT 的两种形式。两个示例都返回字符串“BANGBANGBANG”:
SELECT REPEAT('BANG',3) AS Tripled
BANGBANGBANG
SELECT {fn REPEAT('BANG',3)} AS Tripled
BANGBANGBANG
在最近一次探索马里兰小镇的 "度假 "期间,我偶然发现了一家非常令人愉快的书店,在那里我愉快地消磨了一下午。我和我的家人都是读者,喜欢各种类型的书--新的、二手的、印刷的、电子的。我们尽量在当地购物,以帮助零售店保持运营。
这次访问促使我思考图书行业所发生的事情与我们的医疗保健系统所发生的事情之间的一些相似之处。
医疗保健行业与图书行业的趋势
数字化
我们阅读内容的格式已经发生了根本性的变化。在2020年,电子书几乎占美国市场的四分之一。音频书占美国图书收入的10亿美元。许多印刷书籍是按需出版的,而不是保存在库存中。同样,医疗保健早已不再是一个“伸出舌头说啊 ”的行业,基因组测试、由人工智能算法读取的X射线、可植入设备和远程医疗访问已经改变了医疗的面貌。
虚拟服务
书店现在有多种形式,医疗机构也是如此。订阅图书服务,从当地独立的小公司、大的连锁店、电子零售的网上订单。而与你的本地门诊竞争的是你手机上的一个应用程序。同样,你的治疗师可能是一个机器人,你的基层医疗服务可能由你社区附近药店的驻店医师提供,你可能在一个办公园区做手术。在所有这些竞争中,我们如何确保在我们需要时仍有健康的、提供全面服务的医院?
更智能的算法
分析和预测模型现在几乎和个人推荐一样重要。过去,当我想要一本书的建议,或者一个医生,我就会问朋友。虽然我仍然这样做,但我也同样有可能去看Goodreads,或查看在线医生评论。
设置可重复的开发环境的最简单的方法之一是使用容器。我发现在快速迭代时,在我的开发环境容器里托管一个vscode实例是非常方便的。因此,我创建了一个快速的容器脚本,将一个基于浏览器的vscode添加到IRIS容器中。这应该适用于大多数2021.1以上的容器。我的代码库可以在这里找到
带VSCode 且预连接好的InterSystems IRIS 容器
| Cred | Value |
|---|---|
| User | _SYSTEM |
| Password | SYS |

这个项目创建了一个IRIS容器,在同一个IRIS容器中提供了vscode的托管(web-based)版本。这提供了:
git clone https://github.com/nickmitchko/Hosting-vscode-in-a-container.gitdocker build . -t vscode-irishealth-ml:latest --no-cachedocker-compose up
将度数转换为弧度的数值函数。
RADIANS(numeric-expression)
{fn RADIANS(numeric-expression)}
numeric-expression - 以度为单位的角度度量。解析为数值的表达式。RADIANS 返回 NUMERIC 或 DOUBLE 数据类型。如果 numeric-expression 是数据类型 DOUBLE,RADIANS 返回 DOUBLE;否则,它返回 NUMERIC。
RADIANS 可以指定为标准标量函数或带有大括号语法的 ODBC 标量函数。
RADIANS 以度为单位进行角度测量,并以弧度返回相应的角度测量。如果传递 NULL 值,RADIANS 将返回 NULL。
返回值的默认精度为 36,默认小数位数为 18。
可以使用 DEGREES 函数将弧度转换为度数。
以下嵌入式 SQL 示例以 30 度为增量返回与从 0 到 365 的度值对应的弧度等效值:
/// d ##class(PHA.TEST.SQLFunction).日期函数,它将一年中的季度作为日期表达式的整数返回。
{fn QUARTER(date-expression)}
date-expression - 表达式,它是列的名称、另一个标量函数的结果,或者是日期或时间戳文字。QUARTER 返回一个从 1 到 4 的整数。季度是针对 日期整数、$HOROLOG 或 $ZTIMESTAMP 值、ODBC 格式日期字符串或时间戳计算的。
日期表达式时间戳可以是数据类型 %Library.PosixTime(编码的 64 位有符号整数),也可以是数据类型 %Library.TimeStamp (yyyy-mm-dd hh:mm:ss.fff)。
四个季度的时间段如下:
| Quarter | Period (inclusive) |
|---|---|
| 1 | January 1 to March 31 (90 or 91 days) |
| 2 | April 1 to June 30 (91 days) |
| 3 | July 1 to September 30 (92 days) |
| 4 | October 1 to December 31 (92 days) |
QUARTER 基于日期时间字符串的月份部分。但是,所有日期表达式都经过验证,并且必须包含 1 到 12 范围内的月份以及指定月份和年份的有效日期值。

InterSystems数据平台上可能运行着多种应用,例如Web网页应用、SOAP服务、REST API、HL7 接口、SQL服务等等。这些应用种类繁多,面临的安全风险也是巨大的,例如代码注入攻击和HTTP的跨站请求伪造攻击等。
这其中代码注入攻击和针对Web应用的攻击尤其需要重视。
代码注入攻击通常和我们编写的程序相关,需要在程序编写时注意避免。
SQL注入攻击是典型的代码注入攻击,通过从外部注入恶意SQL语句获得数据权限并获得敏感数据。关系型访问方式都是通过客户端SQL语句传入执行的,因此它是数据库重点需要防范的。
InterSystems数据平台并不支持以分号分割的多条SQL语句作为一个SQL命令执行,因此它本身免疫了主要的SQL注入攻击手段。
InterSystems数据平台支持动态SQL,即允许SQL命令作为方法的字符串参数传入,这会给SQL注入攻击留有隐患。在编程时,应避免开放服务用于接受完整的SQL语句作为参数,而是通过SQL动态传参来构建运行时SQL。
InterSystems数据平台支持行级安全,这有助于避免在SQL注入攻击时,将所有数据返回给攻击请求。
InterSystems数据平台提供了系统函数$ZF,用以调用外部命令。其中$ZF(-1)和$ZF(-2)用以调用服务器操作系统的命令。
IntegratedML 函数,它应用指定的训练模型来预测提供的每个输入行的结果。
PREDICT(model-name )
PREDICT(model-name USE trained-model-name )
PREDICT(model-name WITH feature-columns-clause )
PREDICT(model-name USE trained-model-name WITH feature-columns-clause )
PREDICT 是一个 IntegratedML 函数,可用作 SELECT 选择项以返回将经过训练的机器学习模型应用于指定查询的结果。

这篇文章是对我的 iris-globals-graphDB 应用的介绍。
在这篇文章中,我将演示如何在Python Flask Web 框架和PYVIS交互式网络可视化库的帮助下,将图形数据保存和抽取到InterSystems Globals中。
#create and establish connection
if not self.iris_connection:
self.iris_connection = irisnative.createConnection("localhost", 1972, "USER", "superuser", "SYS")
# Create an iris object
self.iris_native = irisnative.createIris(self.iris_connection)
return self.iris_native
#import nodes data from csv file
isdefined = self.iris_native.isDefined("^g1nodes")
if isdefined == 0:
with open("/opt/irisapp/misc/g1nodes.csv", newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
self.iris_native.set(row["name"], "^g1nodes", row["id"])
#import edges data from csv file
isdefined = self.iris_native.isDefined("^g1edges")
if isdefined == 0:
with open("/opt/irisapp/misc/g1edges.csv", newline='') as csvfile:
reader = csv.DictReader(csvfile)
counter = 0
for row in reader:
counter = counter + 1
#Save data to globals
self.iris_native.set(row["source"]+'-'+row["target"], "^g1edges", counter)
#Get nodes data for basic graph
def get_g1nodes(self):
iris = self.get_iris_native()
leverl1_subscript_iter = iris.iterator("^g1nodes")
result = []
# Iterate over all nodes forwards
for level1_subscript, level1_value in leverl1_subscript_iter:
#Get data from globals
val = iris.get("^g1nodes",level1_subscript)
element = {"id": level1_subscript, "label": val, "shape":"circle"}
result.append(element)
return result
#Get edges data for basic graph
def get_g1edges(self):
iris = self.get_iris_native()
leverl1_subscript_iter = iris.iterator("^g1edges")
result = []
# Iterate over all nodes forwards
for level1_subscript, level1_value in leverl1_subscript_iter:
#Get data from globals
val = iris.get("^g1edges",level1_subscript)
element = {"from": int(val.rpartition('-')[0]), "to": int(val.rpartition('-')[2])}
result.append(element)
return result
<script type="text/javascript">
// initialize global variables.
var edges;
var nodes;
var network;
var container;
var options, data;
// This method is responsible for drawing the graph, returns the drawn network
function drawGraph() {
var container = document.getElementById('mynetwork');
let node = JSON.parse('{{ nodes | tojson }}');
let edge = JSON.parse('{{ edges | tojson }}');
// parsing and collecting nodes and edges from the python
nodes = new vis.DataSet(node);
edges = new vis.DataSet(edge);
// adding nodes and edges to the graph
data = {nodes: nodes, edges: edges};
var options = {
"configure": {
"enabled": true,
"filter": [
"physics","nodes"
]
},
"nodes": {
"color": {
"border": "rgba(233,180,56,1)",
"background": "rgba(252,175,41,1)",
"highlight": {
"border": "rgba(38,137,233,1)",
"background": "rgba(40,138,255,1)"
},
"hover": {
"border": "rgba(42,127,233,1)",
"background": "rgba(42,126,255,1)"
}
},
"font": {
"color": "rgba(255,255,255,1)"
}
},
"edges": {
"color": {
"inherit": true
},
"smooth": {
"enabled": false,
"type": "continuous"
}
},
"interaction": {
"dragNodes": true,
"hideEdgesOnDrag": false,
"hideNodesOnDrag": false,
"navigationButtons": true,
"hover": true
},
"physics": {
"barnesHut": {
"avoidOverlap": 0,
"centralGravity": 0.3,
"damping": 0.09,
"gravitationalConstant": -80000,
"springConstant": 0.001,
"springLength": 250
},
"enabled": true,
"stabilization": {
"enabled": true,
"fit": true,
"iterations": 1000,
"onlyDynamicEdges": false,
"updateInterval": 50
}
}
}
// if this network requires displaying the configure window,
// put it in its div
options.configure["container"] = document.getElementById("config");
network = new vis.Network(container, data, options);
return network;
}
drawGraph();
</script>
#Mian route. (index)
@app.route("/")
def index():
#Establish connection and import data to globals
irisglobal = IRISGLOBAL()
irisglobal.import_g1_nodes_edges()
irisglobal.import_g2_nodes_edges()
#getting nodes data from globals
nodes = irisglobal.get_g1nodes()
#getting edges data from globals
edges = irisglobal.get_g1edges()
#To display graph with configuration
pyvis = True
return render_template('index.html', nodes = nodes,edges=edges,pyvis=pyvis)
下面是关于此项目的 介绍视频:
一个数值函数,它返回给定表达式的指定幂的值。
POWER(numeric-expression,power)
{fn POWER(numeric-expression,power)}
numeric-expression - 基数。可以是正整数或负整数或小数。power - 指数,它是数值表达式的幂。可以是正整数或负整数或小数。POWER 返回 NUMERIC 或 DOUBLE 数据类型。如果 numeric-expression 是数据类型 DOUBLE,则 POWER 返回 DOUBLE;否则,它返回 NUMERIC。
POWER 计算一个数字的另一个幂。它返回一个精度为 36、比例为 18 的值。
请注意,POWER 可以作为 ODBC 标量函数(使用大括号语法)或 SQL 通用标量函数来调用。
numeric-expression 和 power 的所有组合都是有效的,除了:
POWER(0,-m):0 数字表达式和负幂会导致 SQLCODE -400 错误。POWER(-n,.m):负数值表达式和小数幂会导致 SQLCODE -400 错误。要用程序编辑Production(界面),你可以使用互操作性API和SQL查询的组合。
从顶层了解你目前正在工作的命名空间和生产是很重要的。
// Object script
// The active namespace is stored in this variable
$$$NAMESPACE
// Print namespace
Write $$$NAMESPACE
# Python
import iris
# The active namespace is returned from this method
iris.utils._OriginalNamespace()
# Print namespace
print(iris.utils._OriginalNamespace())
>>> DEMONSTRATION
另外,知道你的Production名称是很重要的,你可以使用以下API获得名称空间中正在运行的Production。
// ObjectScript
USER>ZN "DEMONSTRATION"
// Get current or last run production
DEMONSTRATION>W ##class(Ens.返回子字符串在字符串中的位置的字符串函数。
POSITION(substring IN string)
substring - 要搜索的子字符串。
它可以是列的名称、字符串字面值或另一个标量函数的结果,其中基础数据类型可以表示为任何字符类型(如CHAR或VARCHAR2)。IN string - 要在其中搜索子字符串的字符串表达式。POSITION返回INTEGER数据类型。
POSITION返回字符串中子字符串的第一个位置。
位置以整数形式返回。
如果substring没有找到,则返回0(0)。
如果传递给任何一个参数一个NULL值,POSITION将返回NULL。
位置是区分大小写的。 使用其中一个大小写转换函数来定位字母或字符串的大写和小写实例。
POSITION、INSTR、CHARINDEX和$FIND都将搜索字符串中指定的子字符串,并返回与第一个匹配项对应的整数位置。
CHARINDEX、POSITION和INSTR返回匹配子字符串的第一个字符的整数位置。
$FIND返回匹配子字符串结束后第一个字符的整数位置。
CHARINDEX、$FIND和INSTR支持指定子字符串搜索的起始点。
INSTR还支持从起始点指定子字符串出现。
InterSystems 数据平台对用户和角色提供全面的管理和安全配置功能。加强数据平台的安全,需要加强对于用户和角色的管理。
系统提供了一系列预置的用户账户,这些账户管理对应特殊的系统功能:
|
用户 |
说明 |
|
UnknownUser |
匿名用户,通过“未验证”方式登录到系统的用户 |
|
_SYSTEM |
SQL系统管理员 |
|
SuperUser |
超级用户 |
|
Administrator |
安装系统的用户 |
|
Admin |
系统管理员 |
|
CSPSystem |
Web网关管理员 |
|
IAM |
IAM用户 |
|
_PUBLIC |
内部使用 |
|
_Ensemble |
内部使用 |
InterSystems数据平台有一些系统级别的用户安全配置,例如密码模式、密码有效天数、无效登录限制(多少次登录失败后要禁用用户账户)、非活动限制(多少天未登录后禁用用户账户)等。这些系统级配置通过管理门户>系统>安全管理>系统范围的安全参数:
.png)
三级等保对于用户的密码强度是有要求的。弱密码只需要0.19毫秒就能被破解,而8位强密码破解需要上百年。
数据平台不仅要安全,还要合规,三级等保是我们要符合的主要安全规范。InterSystems的数据平台和集成平台产品都和三级等保有关。如果没有正确配置它们的安全选项,就会影响到整个系统的安全,影响到合规性。
在生产环境上,如何配置安全的InterSystems的数据平台,并达到三级等保的要求?
这个系列文章,针对InterSystems 数据平台的安全架构,围绕对三级等保的合规性展开,介绍如何配置出一个安全、合规的数据平台。
注:本文提到的InterSystems的数据平台,包括Caché数据库、Ensemble集成平台、HealthConnect医疗版集成平台和InterSystems IRIS数据平台。
|
三级等保要求
|
对数据平台的要求
|
|
身份鉴别
|
确保用户身份是真实、准确的
|
|
访问控制
|
控制:谁、以什么方式、从什么设备可以访问什么数据和功能? |
系统实用类:SYS.Database中的查询FreeSpace可以用来在任何时候检查磁盘上的自由空间。
下面是在IRIS终端中的尝试方法(进入%SYS命名空间,然后运行它)。
zn "%SYS"
set stmt=##class(%SQL.Statement).%New()
set st=stmt.%PrepareClassQuery("SYS.Database","FreeSpace")
set rset=stmt.%Execute()
// 一次性显示所有
do rset.%Display()输出结果示例如下。
*在命令执行的例子中,所有的数据库都放在同一个磁盘上,所以所有的磁盘空闲空间(DiskFreeSpace)返回相同的值。
[toc]
将数字转换为规范排序格式的排序函数。
%PLUS(expression)
%PLUS expression
expression - 表达式,它可以是列的名称、数字或字符串字面值、算术表达式或另一个函数的结果,其中基础数据类型可以表示为任何字符类型。%PLUS将数字或数字字符串转换为规范形式,然后以数字排序顺序返回这些表达式值。
数字可以包含前导和后导零、多个前导加减号、单个小数点指示符(.)和E指数指示符。
在标准形式中,将执行所有算术运算,展开指数,将符号解析为一个前导减号或无符号,并剥离前导和后导零。
可以使用或不使用封闭字符串分隔符来指定数字字面值。
如果字符串包含非数字字符,%PLUS将在第一个非数字字符处截断数字,并以规范形式返回数字部分。
非数字字符串(任何以非数字字符开头的字符串)返回为0。
%PLUS也返回null为0。
%PLUS是一个SQL扩展,用于SQL查询查询。
可以使用 %SYSTEM.Util 类的 Collation() 方法在 ObjectScript 中执行相同的排序规则转换:
WRITE $SYSTEM.Util.Collation("++007.500",3)
将 %PLUS 与 %MVR 排序规则进行比较,后者根据字符串中的数字子字符串对字符串进行排序。
你好!
我想知道,如果在没有运行%BuildIndices()方法的情况下向表中插入索引,是否会有问题。
需要注意的是,在索引之前插入的数据对于检索来说并不重要,所以在索引之前插入的数据在查询中不显示并不是问题。
我问这个问题的原因是,我想避免在需要插入这种索引的大表中进行索引重建。
我正在使用Cache 2018.1。
谢谢。
José
Hi!
I'd like to know if there are any issues if an index is inserted into a table without running the %BuildIndices() method.
It's important to note that data inserted before the index is not important for retrieval, so it's not a problem data inserted before the index don't show up in queries.
The reason why I'm asking this is that I'd like to avoid index reconstruction on big tables which I need to inser such index.
.png)
返回由分隔符标识的子字符串的字符串函数。
$PIECE(string-expression,delimiter[,from[,to]])
string-expression - 要从中提取子字符串的目标字符串。
表达式,可以是字段名、字符串字面值、数字或其他函数的结果。delimiter - 用于标识子字符串的分隔符。from - 可选-指定要从目标字符串返回的子字符串或子字符串范围的开头的整数。
子字符串由分隔符分隔,从1开始计数。
如果省略,则返回第一个子字符串。to - 可选-一个整数,指定从目标字符串返回的子字符串范围的结束子字符串。
必须与from连用。$PIECE从字符串表达式中返回指定的子字符串(PIECE)。
返回的子字符串取决于所使用的参数:
$PIECE(string-expression,delimiter)返回string-expression中的第一个子字符串。
如果delimiter出现在字符串表达式中,则这是在delimiter第一次出现之前的子字符串。
如果分隔符没有出现在字符串表达式中,则返回的子字符串为字符串表达式。注意:下面内存设置数值仅限参考,具体内存数值的设置是否合适,依赖于更多实际使用情况决定。
主要需要设置下面几个内存相关配置:
(下面比例适用于服务器仅运行单实例InterSystems IRIS)
数据库缓存Database cache:
建议小于64G内存设置总内存50%,大于等于64G内存设置70%总内存
程序缓存routine cache:
建议设置1023MB
gmheap:
建议设置1048576KB(1024MB)
LockSize:
建议最少设置134217728 Bytes (128MB),如果在系统日志中提示locksize相关错误或警报,应相应增加。
如果在一台服务器上安装了多个InterSystems IRIS 实例,那么要保证 所有InterSystems IRIS 运行实例的 Shared memory(database cache + routine cache + gmheap) 总值小于 Hugepage设定的值
hugePages :
建议设置值大于系统所有InterSystems IRIS 运行实例的 Shared memory(database cache + routine cache + gmheap) 总值再往上取整+1G。之后监控cache efficiency 调整设置大小。
此文章也是对问题 在不重建的情况下插入索引Inserting an index without reconstruction 的一种解释
在使用SQL语言对 InterSystems IRIS 中的表进行查询时,有时候会发现返回的结果与实际有出入,特别是使用count() 函数,或者select 查询时,返回的结果少于实际应返回的值。
这种情况往往是由于数据表格的索引值出了问题。
索引出问题的主要原因可能是:
要解决或者要检查是不是索引引发的问题,可以使用%ValidateIndices()函数,它有两种方式使用
$SYSTEM.OBJ.ValidateIndices(classname,idxList,autoCorrect,lockOption,multiProcess)
或者
##class(classname).%ValidateIndices(idxList,autoCorrect,lockOption,multiProcess)
两种使用方法最大的差别是:$SYSTEM.OBJ.
Docker 20.10.14(2022年3月23日发布)改变了赋予容器的Linux能力,其方式与InterSystems IRIS 2021.1(及以上)容器的Linux能力检查器不兼容。
在Linux上运行Docker 20.10.14的用户会发现,IRIS 2021.1+容器将无法启动,并且日志会错误地报告缺少所需的Linux能力。 比如说。
[ERROR] Required Linux capability cap_setuid is missing. [ERROR] Required Linux capability cap_dac_override is missing. [ERROR] Required Linux capability cap_fowner is missing. [ERROR] Required Linux capability cap_setgid is missing. [ERROR] Required Linux capability cap_kill is missing. [FATAL] Your IRIS container is missing one or more required Linux capabilities.
遇到这个问题的用户需要调整传递给容器入口的命令行,以禁用对Linux功能的检查。
我想介绍一下我参加Globals竞赛的新项目。一个非常新的Globals浏览器视图
.png)
返回pi常数值的标量数值函数。
{fn PI()}
{fn PI}
PI不接受参数。
它返回数学常数pi作为数据类型NUMERIC,精度为19,刻度为18。
PI只能使用ODBC标量函数(花括号)语法调用。
请注意,参数括号是可选的。
下面的例子都返回pi的值:
SELECT {fn PI()} AS ExactPi
3.141592653589793238
SELECT {fn PI} AS ExactPi
3.141592653589793238
使用 JDBC 链接 InterSystems :
.png)
然后就可以像其他关系型数据库使用的方式来使用Kettle。
返回 ID 字段的 OID 的标量函数。
%OID(id_field)
id_field - ID 字段或引用字段的字段名称。%OID 采用字段名称并返回对象的完整 OID(对象 ID)。该字段必须是 ID 字段或引用字段(外键字段)。在 id_field 中指定任何其他类型的字段会生成 SQLCODE -1 错误。
以下示例显示了与引用字段一起使用的 %OID:
SELECT Name, Spouse, %OID(Spouse)
FROM Sample.Person
WHERE Spouse IS NOT NULL
以下嵌入式 SQL 示例显示了与引用字段一起使用的 %OID:
/// d ##class(PHA.TEST.SQLFunction).Oid()
ClassMethod Oid()
{
&sql(SELECT Name, Spouse, %OID(Spouse)
INTO :n,:s,:soid
FROM Sample.Person)
w !,"Name is:",n
w !,"Spouse name is:",s
w !,"Spouse OID is:",soid
}
DHC-APP>d ##class(PHA.TEST.SQLFunction).众所周知,InterSystems IRIS的产品设计理念源于互操作性(Interoperable)、稳定性(Reliable)、直观(Intuitive)、可扩展性(Scalable),在云时代,InterSystems IRIS的云上操作与本地一样便捷,令用户体验有了明显提升,除此之外,为了更高效地对InterSystems IRIS进行配置,我们还提供了哪些新特性?为了便捷地进行数据迁移,InterSystems IRIS最新版本提供了哪些解决方案?
4月12日,新一期“极客俱乐部”在线分享即将推出,InterSystems中国技术总监乔鹏将分享“InterSystems数据平台与三级等保”这一主题,聊聊数据平台如何保护信息安全,以及如何配置、管理数据平台,以满足三级等保要求。点击链接报名参会,或扫描下方二维码参会。