搜索​​​​

清除过滤器
公告
Claire Zheng · 一月 23, 2022

欢迎中文社区新版主@黎卫东

亲爱的社区开发者们, 我很高兴地向大家介绍一位我们的新版主@黎卫东(Weidong Li)。 @黎卫东(Weidong Li)目前担任上海嘉会国际医院集成平台经理一职 以下是@黎卫东(Weidong Li)的一些自我介绍: – 我从加入嘉会之后开始了解 InterSystems 的技术以及集成平台开发。接触并使用了 InterSystems早期的Caché版本,Cube, Ensemble 并升级到了基于 Iris 的 Health Connect 平台,并深度了解这些版本的一些特性以及基于 Health Connect 打造高效的集成平台。 – 本人有超过16年的医疗信息化经验,熟悉 IHE/DICOM/HL V2/V3,有着丰富的领域知识。曾先后就职于 INFINITT,AGFA, Carestream 等主流的 HIT 公司,设计并开发过多种医疗信息系统及设计的信息集成。在目前医院,带领一个小型的团队,基于 Health Connect,从0开始设计了整个集成平台的底层架构,整体业务流程,开发流程,开发规范,发布部署规范,第三方系统接入,运维部署,运维监控以及安全体系,打造了一个安全、高效、高可用的业务中台,连接了临床、非临床、Iot、智慧医院等多个应用场景。 – InterSystems 平台是一个非常优秀的集成平台,借助该技术,给我们业务带来了非常大的便于。我也希望这么优秀的技术,能给更多的兄弟单位和合作伙伴创造价值。我也希望能够在社区与大家一起交流,分享自己的一些实践经验;同时也希望借助这个平台,向大家学习一些优秀的实践。我们一起成长,共同进步! 热烈欢迎! 感谢@黎卫东(Weidong Li),期待您成为一名优秀的新版主! 👏 Welcome @Weidong.Li ! 热烈欢迎黎老师!
文章
Michael Lei · 六月 26, 2022

从Web 应用端用代码实现OAuth2 和基础认证、鉴权和审计

在这篇文章中,我将解释如何通过使用CSP Web应用程序以及启用/禁用和认证/取消认证任何Web应用程序的代码来进行认证、授权和审计。 在线 Demo -- https://dappsecurity.demo.community.intersystems.com/csp/user/index.csp (SuperUser | SYS) 推荐大家看下这个视频: https://www.youtube.com/watch?v=qFRa3njqDcA 应用层 从认证开始 认证可以验证任何试图连接到InterSystems IRIS®的用户或其他实体的身份。正如人们常说的,认证是你如何证明你是你所说的人。 有许多不同的方法可以对用户进行认证;每一种方法都被称为认证机制。InterSystems IRIS支持一系列的认证机制: Kerberos — Kerberos协议被设计用来在不安全的网络上为服务提供安全认证。Kerberos使用Ticket来验证用户,避免了在网络上交换密码。 Operating System–Based — 基于操作系统的认证使用操作系统对每个用户的身份认证来识别该用户对InterSystems IRIS的身份。 Instance Authentication — 通过实例验证,InterSystems IRIS提示用户输入密码,并将所提供的密码的哈希值与它所存储的值进行比较。 Lightweight Directory Access Protocol (LDAP) — 通过轻量级目录访问协议LDAP,InterSystems IRIS根据LDAP服务器中的信息对用户进行认证。 Delegated Authentication — 委托认证提供了一种创建自定义认证机制的方法。应用程序开发人员完全控制委托认证代码的内容。 我使用实例验证,对于用户的创建,我们可以使用以下objectscript命令: &sql(CREATE USER TestUser IDENTIFY BY demo) 创建 TestUser 和 demo 密码 审计Auditing 在创建用户记录时,也通过使用以下objectscript命令添加到审计数据库中: Do $SYSTEM.Security.Audit("%System","%Security","UserChange","User:TestUser | Password:demo","Audit Log inserted from Data_APP_Security") 请参考审计相关的文档 (Auditing Guide) : https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=AAUDIT 授权Authorization 一旦认证完成,我们需要创建角色并授予角色以权限,然后将角色与用户联系起来(授权)。我们将分三步来做这件事 第一步 : 通过使用以下objectscript命令创建角色,我们正在创建ReadWrite角色 &sql(CREATE ROLE ReadWrite) 第二步: 在表上授予SELECT,UPDATE,INSERT权限,我们将scw.Patient表的权限分配给ReadWrite角色。 &sql(GRANT SELECT,UPDATE,INSERT ON scw.Patient TO ReadWrite) 第三步: 给用户授予角色,我们给TestUser用户分配ReadWrite角色 &sql(GRANT ReadWrite To TestUser) 启用/禁用Web应用 我们可以通过使用以下objectscript代码启用或禁用Web应用程序 New $Namespace Set $Namespace = "%SYS" Set App = ##class(Security.Applications).%OpenId("/terminal") Set App.Enabled=0 Do App.%Save() 这里"/终端 "是我们应用程序的名称。应用程序可以通过设置 "App.Enabled "为0来禁用,通过设置值为1来启用 认证/取消 Web 应用 我们可以通过使用以下objectscript代码来设置认证 New $Namespace Set $Namespace = "%SYS" Set App = ##class(Security.Applications).%OpenId("/terminal") Set App.AutheEnabled=0 Do App.%Save() 这里"/终端 "是我们应用程序的名称。认证可以通过使用"App.AutheEnabled" 属性来设置. 可以设置以下数值 property AutheEnabled as Security.Datatype.Authentication [ InitialExpression = 64 ]; Authentication and Session mechanisms enabled (CSP Only). Bit 2 = AutheK5API Bit 5 - AutheCache Bit 6 = AutheUnauthenticated Bit 11 = AutheLDAP Bit 13 = AutheDelegated Bit 14 = LoginToken Bit 20 = TwoFactorSMS Bit 21 = TwoFactorPW 谢谢 源代码:https://openexchange.intersystems.com/package/Data_APP_Security
公告
Claire Zheng · 二月 22, 2021

版主招募进行时

大家好! InterSystems开发者社区中文版正在招募版主,以更好地推动中文社区建设,期待每一位开发者的积极参与,共同打造一个高效沟通的技术社区! 欢迎点击报名(或扫描下方二维码),审核通过后,我们会与您详细沟通版主权益及义务。 - 已经停止收集拉 没有停止收集,请直接扫码报名
公告
Claire Zheng · 六月 16, 2021

6月19日直播报名 | 国内外互联互通标准解读与实践

为了解国内外最新的互联互通标准,共同助推我国卫生信息互联互通标准化成熟度测评工作,指导各地医院信息平台的建设,《中国卫生信息管理杂志》社决定召开国内外互联互通标准解读与实践线上交流会。会议由《中国卫生信息管理杂志》社主办,InterSystems中国协办,欢迎报名参会!
问题
li liao · 八月 30, 2023

Caché 2016.1 CDC

参考 https://blog.csdn.net/InterSystems/article/details/115350635 搭建 mirror ,获取数据变更,示例给出了获取数据变更的代码: Class ZCustom.MirrorDejournal Extends SYS.MirrorDejournal{ Method RunFilter( MirrorDBName As %String, GlobalReference As %String, RecordType As %String, Address As %Integer) As %Integer{ Set ^CDCLog( $I($^CDCLog))=$lb(MirrorDBName,GlobalReference,RecordType,Address) Quit 1} 示例代码将变更存储在 global 对象 CDCLog 中,想请问下获取变更前后数据,发送到外部系统,有哪些方式? 可以参考我们的CDC系列文章https://cn.community.intersystems.com/node/491941,谢谢!
公告
Anastasia Dyubaylo · 三月 21

计划维护通知

🚨 计划维护通知 🚨 InterSystems 开发者社区将于明天(2025 年 3 月 22 日)美国东部时间上午 10:30 至下午 12:30(欧洲中部时间下午 16:30 至下午 18:30)进行计划维护。 在此期间,平台可能会出现间歇性停机。我们对给您带来的不便深表歉意,感谢您的耐心等待,我们将努力改进我们的服务。 感谢您的理解!
文章
Louis Lu · 一月 15, 2021

什么是核心文件,它们什么时候有用

# 什么是核心文件? 它们什么时候有用? 本文档中的信息以 2019 年 6 月 30 日发布的 InterSystems 产品最新版本为准。 此更新涵盖了截至 2020 年 4 月 14 日发现的错误,但不包括 InterSystems 产品新版本中的更改。不过,现有产品的细节不会经常变化。本文的 PDF 版本可以从 WRC 获取 目录 核心文件基础知识 SuSE Linux Windows AIX Ubuntu Linux 测试 Docker macOS (Darwin) 健全性测试 HP–UX OpenVMS 传输 RedHat Linux Solaris 索引 核心文件基础知识 Caché、Ensemble、HealthShare 和 InterSystems IRIS 数据平台非常可靠。 我们的绝大多数客户从未经历过任何种类的故障。 但是,在极少数情况下,进程发生过故障,并因此生成了核心文件(在 Windows 和 OpenVMS 上称为进程转储文件process dump file)。 核心文件记录了进程发生故障时的进程状态,包括进程寄存器和内存(是否包括共享内存的信息取决于配置)。 核心文件实质上是发生故障的进程在试图执行错误操作时的瞬时画面。 我们可以根据该画面向回推断,以找出导致故障的最初错误。 随着我们回溯过去的时间越久远,进程的信息逐渐变得模糊。 核心越详细,我们可以回溯的时间就越远,直到画面变得过于模糊。 借助正确收集的核心文件和相关信息,我们通常可以解决问题,或者以其他方式提取故障进程的有价值信息。 对于人为生成的核心文件,通常我们只能说(在经过数小时分析后):“我看到这个进程发生了什么,有人手动生成了进程核心。” 手动生成核心文件可以包含更多正在运行进程的信息,它可用作辅助信息源,以补充无法从系统默认核心文件提供的信息细节。 InterSystems 产品可以配置为在发生任何进程故障时都记录完整核心。 这对日常操作的性能没有任何影响。 您只需要保证有足够的磁盘可用空间,以应对任何潜在的、小概率发生的故障。 InterSystems 只要能获得完整核心,在解决问题方面都有着良好的记录。 有时我们会发现由难解的硬件引发的故障,并保证这种故障不会再次发生。 InterSystems 产品还可以配置为很少记录或不记录进程故障的信息。 虽然禁用核心没有性能优势,但您可能会获得运行优势。 核心文件可能包含敏感信息。 如果您不想制定保护核心文件的策略,可以只在反复出现故障后再启用生成核心文件。 In­ter­Sys­tems 产品默认采用中间方案。 也就是生成有限大小的核心文件。 利用这些小核心文件,InterSystems 通常可以识别是否为以前解决过的问题,并解决这些问题。 当然我们无法保证使用默认的有限的核心文件可以解决所有问题。 用于确定所获得的核心文件的大小和类型的主要控制参数是 DumpStyle。 这是cache.cpf 或 iris.cpf 文件中的参数。 还有其他几个特定于操作系统的控制参数。 Dump­Style 的说明在这里:。DumpStyle 取一个介于 0 到 8 之间的整数值,适用于 Caché、Ensemble、HealthShare 或 InterSystems IRIS 数据平台实例中的每个进程,并定义当进程遇到严重错误时,应保存哪种核心(或进程转储)文件。 定义的值为: 代码 名称 平台 结果 0 NORMAL UnixOpenVMSWindows 生成完整核心(取决于其他设置)。生成 CACCVIO-pid.LOG(大小受限)。生成 pid.dmp(大小受限)。 1 FULL UnixOpenVMSWindows 生成完整核心(取决于其他设置)。生成 CACHE.DMP(可能非常大)。生成 cachefpid.dmp(可能非常大)。 2 DEBUG UnixOpenVMSWindows 在 Caché2014.1 之前,生成省略共享内存的核心,现已弃用。 最好使用操作系统特定的方法省略共享内存。未实现。为 InterSystems 预留。 3 INTERMEDIATE UnixOpenVMSWindows 未实现。未实现。2014.1 版本后有效,生成cacheipid.dmp 4 MINIMAL UnixOpenVMSWindows 未实现。未实现。2014.1 版本后有效,生成cacheipid.dmp 5 NOHANDLER UnixOpenVMSWindows 不注册为信号处理程序。 将有关核心创建的所有决定都留给操作系统。未实现。未实现。 6 NOCORE UnixOpenVMSWindows 不生成核心文件。未实现。未实现。 7 NOFORK UnixOpenVMSWindows 创建核心dump(包含共享内存),但是从原始故障进程而不是从故障进程的分支副本进行创建。未实现。未实现。 8 NOFORKNOSHARE UnixOpenVMSWindows 创建不包含共享内存的核心转储,但是从原始故障进程而不是从故障进程的分支副本进行创建。未实现。未实现。 默认 DumpStyle 为 0 = NORMAL,除了在 Windows 中从 Caché 2014.1 开始,为 3 = INTERMEDIATE。 更改 DumpStyle 值的方法有三种。 分别是: ①将以下部分放在 cache.cpf 或 iris.cpf 文件中,为此,需要使用操作系统的文本编辑器: [Debug] dumpstyle=1 等号后面的数字是新的默认 DumpStyle值。 重新启动 Caché、Ensemble、HealthShare 或 InterSystems IRIS 数据平台后,如果不使用下面的方法 ② 或 ③ ,它会将这个新的值设定为所有进程的默认值。 ②使用命令: SET old=$SYSTEM.Config.ModifyDumpStyle(1) 括号中的数字是新的 DumpStyle 值。 旧值将返回。 此命令对运行后创建的所有新进程都有效。 现有进程继续以先前的 DumpStyle 运行。 此命令从 Caché 2014.1 开始有效。 对于较早的版本,可以使用以下命令: VIEW $ZUTIL(40,2,165):-2:4:1 其中新的 DumpStyle 值是最后一位数字。 ③执行以下命令或将其放在应用程序中: VIEW $ZUTIL(40,1,48):-1:4:1 其中新的 DumpStyle 值是最后一位数字。 这只对执行命令的进程有效,并覆盖方法 ① 和 ②的设定值。 大多数操作系统都可以控制将生成的核心文件重定向到一个公用目录,并控制核心文件中包含的信息数量。 您也应该手动修改这些设置,并且应考虑相应的影响,尤其是从数据隐私的角度。 以下各节介绍了各个操作系统下的详细信息。 将核心文件的输出移动到一个公用目录对于容量规划非常有用,但也可能让希望从您的站点窃取数据的人更容易访问到核心文件。 如果核心文件不包含共享内存,很多类型的问题无法从根本进行解决。 包含共享内存的核心文件往往比不包含共享内存的核心文件大得多。 大部分差异是global和routine缓冲区的大小。 如果你正在处理的是敏感信息,不含共享内存的核心文件将只包含发生故障的进程正在处理的敏感信息。 含有共享内存的核心文件还将包含每个进程最近访问的所有全局变量。 这里用到的“最近”可能表示几分钟,或者相当长的时间。 AIX 生成完整的核心文件应使用 smit 启用: System Environments > Change / Show Characteristics of Operating System > > Enable full CORE dump true > > Use pre-430 style CORE dump false 也可以从命令行使用以下命令查看: # lsattr -E -l sys0 | egrep 'fullcore|pre430core'↩ fullcore true Enable full CORE dump True pre430core false Use pre-430 style CORE dump True 使用以下命令设置: # chdev -l sys0 -a fullcore=true -a pre430core=false -P↩ `-P` 使更改永久有效。 ◆ 默认情况下,当进程发生故障时在进程的默认目录写入核心文件。 该目录通常就是主 CACHE.DAT 或 IRIS.DAT 文件所在的目录。 这可以通过 smit 更改: Problem Determination > Change/Show/Reset Core File Copying Directory 或从命令行运行: # chcore -p on -l /cores -n on -d↩ ◆ 确保文件 /etc/security/limits 的某个部分包含以下行: default: core = -1 最后,无论通过什么方式为用户进程设置环境变量,都确保每个用户都已根据需要定义或未定义 CORE_NOSHM。 如果定义了 CORE_NOSHM=1,核心文件不包含共享内存的内容。 如果定义 CORE_NOSHM=0 或完全未定义,核心文件将包含共享内存的内容。 为所有用户设置此参数简单方法是编辑 /etc/environment 并包含以下行: CORE_NOSHM=1 要分别指定每个用户是否在核心文件中包含共享内存的内容,请根据用户和他们使用的 shell 编辑以下任一文件: CORE_NOSHM=1; export CORE_NOSHM # sh in /etc/profile or $HOME/.profile export CORE_NOSHM=1 # ksh in /etc/.kshrc or $HOME/.kshrc export CORE_NOSHM=1 # bash in /etc/bashrc or ~/.bashrc setenv CORE_NOSHM 1 # csh in ~/.cshrc Docker InterSystems IRIS 数据平台 docker 容器的核心文件创建由主机 Linux 系统控制。 您必须规划将核心文件直接发送至操作系统文件。 该文件可以保存在 docker 容器内,也可以发送至映射的主机 Linux 系统上的目录中。 将核心文件发送至映射的主机 Linux 系统上的目录的优点是,它将在容器完全失效的情况下仍然保存下来。 由于核心文件必须发送到操作系统文件,因此必须在主机平台上禁用所有高级核心捕获软件。 您将需要为主机和容器系统的 /proc/sys/kernel/core_pattern 设置适当的值。 您应该选择一个相对简单并且在主机和容器上都存在的目录(/tmp 或 /cores 显然是最佳选择)。 您可能还需要包含变量,以确保来自多个 docker 容器的核心不会相互覆盖。 因此 /cores/core.%p.%e 是一个好选择。 主机操作系统 禁用 链接 RedHat Linux 必须禁用错误自动报告工具 (ABRT)。 ☞ SuSE Linux 截至 SuSE Linux Enterprise Server 11,SuSE 没有任何高级核心捕获软件。 因此您只需按照说明设置 /proc/sys/ker­nel/core_pat­tern。 但是,到目前为止,我们还没有提供在 SuSE Linux Enterprise Server 12 中禁用高级核心捕获软件的说明,因此 SuSE 12 及更高版本目前不适合作为 docker 容器的主机。 ☞ Ubuntu Linux 必须禁用 apport。 ☞ 启动容器时,您可能希望包含将用于核心文件的目录映射到主机操作系统的选项。 因此: # docker run ⋯ -v /cores:/cores ⋯ ↩ 如果不包含 -v /cores:/cores,则 docker 容器内的进程故障所创建的任何核心文件都只会在 docker 容器运行时存活。 如果 -v 选项给出的映射不是对称的,即冒号左侧和右侧的值不一样,则可能无法捕获某些核心文件内容。 将核心文件大小设置为无限制。 由于这是运行时决定,因此将以下内容添加到 docker run 命令中: # docker run ⋯ --ulimit core=-1 ⋯ ↩ HP–UX 使用以下命令使核心文件保存在公用目录中并带有扩展名称: # coreadm -e global -g /cores/core.%p.%f↩ %p 表示将 pid 放在路径名中,%f 表示将可执行文件名(如 cache 或 iris)放在路径名中。 请参见: % man 1m coreadm↩ 了解更多选项。 ◆ 使用以下命令查看是否已在核心文件中启用共享内存: # /usr/sbin/kctune core_addshmem_read↩ # /usr/sbin/kctune core_addshmem_write↩ 更改为: # /usr/sbin/kctune core_addshmem_read=1↩ # /usr/sbin/kctune core_addshmem_write=1↩ 1 表示启用,0 表示禁用。 HP–UX 将共享内存分为两种类型。 通常,InterSystems 仅使用写共享内存,但我们建议将两种类型设置为相同值。 ◆ 在 HP–UX 上,生成的核心文件大小受 maxdsiz_64bit 内核参数限制。 确保该参数设置得足够高,以便生成完整的核心文件。 可 使用以下命令查看: # /usr/sbin/kctune maxdsiz_64bit↩ 使用以下命令设置: # /usr/sbin/kctune maxdsiz_64bit=4294967296↩ 用户可以使用 ulimit -c 命令进一步限制核心文件大小。 应该从 /etc/profile、$HOME/.profile 以及其他 shell 的类似文件中删除此设置,除非您有意限制核心文件。 RedHat Linux 如果您正在运行 Rhel 6.0 或更高版本(CentOS 同样),RedHat 已增加了错误自动报告工具 (ABRT)。 此工具安装后与 Caché、En­sem­ble、HealthShare 或 In­ter­Sys­tems IRIS 数据平台不兼容。 您需要决定您希望将 ABRT 配置为支持 Caché、Ensemble、HealthShare、InterSystems IRIS 数据平台,还是禁用 ABRT。 以下标记了 ABRT 的部分适用于使用 ABRT 的情况, 而标记了 AB/RT 的部分适用于传统的不使用 ABRT 的情况。 ◆ ABRT 要使 In­ter­Sys­tems 产品与 ABRT 兼容,请确定正在运行的 ABRT 版本: # abrt-cli --version↩ 编辑 ABRT 配置文件。 名称会因 ABRT 版本的不同而有所差异: ABRT 1.x: /etc/abrt/abrt.conf ABRT 2.x: /etc/abrt/abrt-action-save-package-data.conf 如果您使用 cinstall 命令安装了 Caché、Ensemble 或 HealthShare(最常见),或使用 irisinstall 命令安装了 InterSystems IRIS 数据平台,请找到 ProcessUnpackaged= 行,将值更改为 yes。 ProcessUnpackaged = yes 否则,如果是从 RPM 模块安装的 Caché、Ensemble、HealthShare 或 In­ter­Sys­tems IRIS 数据平台,则找到 OpenGPGCheck= 行,将值更改为 no。 OpenGPGCheck = no 不管是如何安装的 Caché、Ensemble、HealthShare 或 In­ter­Sys­tems IRIS 数据平台,都找到 BlackListedPaths= 行,并添加对 in­stal­la­tion/bin 目录中的 cstat 或 irisstat的引用。 如果 Black­List­ed­Paths= 行不存在,则在末尾添加此行以及cstat 或 iris­stat 引用。 BlackListedPaths=[retain_existing_list,]installation_directory/bin/cstat 保存所做编辑,然后重新启动 abrtd: # service abrtd restart↩ 这样配置后,ABRT 会为每次进程故障创建一个新目录(在 /var/spool/abrt 或 /var/tmp/abrt 下),并在该目录中放置核心文件以及相关信息。 当进程发生错误时,执行命令: # abrt-cli --list↩ # for ABRT 1.x # abrt-cli list↩ # for ABRT 2.x­­ 这将显示最近进程故障的列表,并为每个故障提供一个目录规范。 每个目录中都将有一个 coredump文件,以及许多其他小文件,这些文件对于确定进程故障的原因非常有用。 % tar -cvzf <var>wrcnumber</var>-core.tar.gz /var/spool/abrt/<var>directory</var>/*↩ 其中 wr­c­num­ber 是 In­ter­Sys­tems 分配用来调查案例的编号。 您可以将压缩的 wrcnumber-core.tar.gz 文件发送给我们。 ◆ AB/RT 或者,可以使用以下命令禁用 ABRT: # service abrtd stop↩ # service abrt-ccpp stop↩ # ABRT 2.x only. 要永久禁用 ABRT: # chkconfig abrtd off↩ # chkconfig abrt-ccpp off↩ # ABRT 2.x only. 最后,您需要更新 /proc/sys/kernel/core_pattern,请参见下一节。 ◆ AB/RT 您可以控制核心文件的存储位置(除非您正在使用 ABRT)。 ① : 如果正在使用 ABRT,则必须跳过此步骤。 ② : 如果已禁用 ABRT,则必须执行此步骤。 ③ : 如果从未安装 ABRT,则此步骤是可选的。 编辑文件 `/proc/sys/ker­nel/core_pat­tern` 在简单的示例中,只需使用: core 添加生成核心的程序的 pid 和名称通常很有用: core.%p.%e 还可以将核心放在公用目录中: /cores/core.%p.%e 确认所有用户对所选目录都具有写访问权限。 请参见 `man core` 了解更多选项。 您应该在目录 /etc/sysctl.d 中创建一个名称以 `.conf` 为结尾的文件,并包含以下内容,从而使此更改永久有效: kernel.core_pattern=/cores/core.%p.%e ◆ ABRT AB/RT 您应该设置 /proc/self/coredump_filter以控制转储到核心文件中的内存大小。 这可以在 /etc/profile.d/some-thing.sh 文件中设置。 命令为: # echo 0x33 >/proc/self/coredump_filter↩ 所使用的具体位映射取决于您希望收集的数据级别。 bits的含义可以在 man core 中找到,对于 InterSystems 产品有意义的示例为: Bit 说明 InterSystems 是否需要 0x01 匿名私有映射。 始终需要。 0x02 匿名共享映射。 复杂问题需要。 0x04 文件支持的私有映射。 $ZF() 相关问题可能需要。 0x08 文件支持的共享映射。 $ZF() 相关问题可能需要。 0x10 转储 ELF 标头。 始终需要。 0x20 转储私有大页。 In­ter­Sys­tems 当前未使用。 0x40 转储共享大页。 In­ter­Sys­tems 当前未使用。 0x80 转储私有 DAX 页 (Rhel 8)。 In­ter­Sys­tems 当前未使用。 0x100 转储共享 DAX 页 (Rhel 8)。 In­ter­Sys­tems 当前未使用。 作为将此命令放在 shell 特定的脚本中的替代方案,您可以在启动期间进行修改。 只有使用 grub2 引导时,这些指令才适用。 您可以通过以下命令测试: # grub2-install --version↩ grub2-install (GRUB) 2.02~beta2 编辑 /etc/de­fault/grub。 更改以 GRUB_CMDLINE_LINUX_DEFAULT= 开头的行。 如果文件中不存在该行,则在末尾添加。 它应该包含: GRUB_CMDLINE_LINUX_DEFAULT="oldcmd coredump_filter=newval " 注意:old­cmd 是 GRUB_CMD­LINE_LINUX_DE­FAULT 的旧值(如果该行先前不存在,则省略)。 new­val` 是 core­dump_fil­ter 的新值,以十六进制表示,带有前导“`0x`”。 运行: # grub2-mkconfig -o /boot/grub2/grub.cfg↩ ◆ ABRT AB/RT 您应该针对所有进程设置 ulimit -c 为无限制。 这可以在文件 /etc/security/limits.conf 中全局设置。 添加以下两行: * soft core unlimited * hard core unlimited SuSE Linux 如果运行 SuSE Linux En­ter­prise Server 12 或更高版本,SuSE 现在将所有生成的核心文件存储在 sys­temd 日志中。 存储在 systemd 日志中的核心文件是临时的。 它们在系统重启后即消失。 如果需要,必须在系统重启前从 sys­temd 日志中提取核心。 要列出 systemd 日志中当前含有的核心文件: # [ systemd- ] coredumpctl list↩ 要提取按照创建了核心的 pid 选择的核心文件: # [ systemd- ] coredumpctl -o core.morename dump pid 注意:从 SuSE 12-SP2 开始,systemd- 前缀已从命令名称中删除。 建议保留此 sys­temd 行为,不要试图修改它。 如果正在运行旧版本的 SuSE Linux Enterprise(11 或更早版本),可以通过编辑文件 /proc/sys/kernel/core_pattern来控制存放核心文件的位置。 在简单的示例中,只需使用: core 通常也需要添加生成核心文件程序的 pid 和名称,使用: core.%p.%e 还可以将核心文件放在公用目录中: /cores/core.%p.%e 确认所有用户对所选目录都具有写访问权限。 请参见 man core 了解更多选项。 可以将以下几行追加到文件 etc/sysctl.conf 中来使此更改永久有效: # Make this core pattern permanent (SuSE 12 breaks this, don't use): kernel.core_pattern=/cores/core.%p.%e ◆ 您应该设置/proc/self/coredump_filter以控制转储到核心文件的内存数量。 这可以在适当的 /etc/profile.d/something.sh文件中运行。 命令为: # echo 0x33 >/proc/self/coredump_filter↩ 所使用的具体bits映射取决于您希望收集的数据级别。 bit 的含义可以在 man core 中找到,对于 InterSystems 产品有意义的示例为: Bit 说明 InterSystems 是否需要 0x01 匿名私有映射。 始终需要。 0x02 匿名共享映射。 复杂问题需要。 0x04 文件支持的私有映射。 $ZF() 相关问题可能需要。 0x08 文件支持的共享映射。 $ZF() 相关问题可能需要。 0x10 转储 ELF 标头。 始终需要。 0x20 转储私有大页。 In­ter­Sys­tems 当前未使用。 0x40 转储共享大页。 In­ter­Sys­tems 当前未使用。 0x80 转储私有 DAX 页 (SuSE 15)。 In­ter­Sys­tems 当前未使用。 0x100 转储共享 DAX 页 (SuSE 15)。 In­ter­Sys­tems 当前未使用。 作为将此命令放在 shell 特定的脚本中的替代方案,您可以在启动期间进行修改。 要执行此操作,请使用yast2。 根据您连接的是终端界面(将使用 curses 界面)还是 GUI 界面,yast2 的用户界面会有所不同。 以下说明尽量做到与界面无关。 ① : 启动 yast2 后,从菜单中选择 Sys­tem → Boot Loader。 ② : 选择 Ker­nel Pa­ra­me­ters 选项卡。 ③ : 查找 Op­tional Ker­nel Com­mand Line Pa­ra­me­ter字段。 ④ : 如果该字段尚未包含coredump_filter=0xvalue,则使用空格分隔符将其追加到该字段中。 如果已经包含该赋值,则只需编辑 value。 ⑤ : 退出菜单系统,然后重新启动。 ◆ 您应该针对所有进程设置 ulimit -c 为无限制。这可以在文件 /etc/security/limits.conf 中进行全局设置。 添加以下两行: * soft core unlimited * hard core unlimited ◆ 注意:可能需要禁用 AppArmor,它会阻止它认为不寻常的应用程序行为,而写入核心文件可能被视为不寻常。 # rcapparmor stop↩ Ubuntu Linux Ubuntu 使用 apport 捕获所有进程故障,对于使用安装包添加的软件包,会创建 apport 报告,其中包含带有附加信息的经过编码和压缩的核心内容。 当然也可以要求 apport 处理未使用 Ubuntu 的软件包管理器(Ubuntu's package manager)安装的应用程序的代码。 不幸的是,如果这样做,Canonical 会将针对未打包代码创建的 apport 报告视为为改进 Ubuntu而收集的信息,进而进行内容检查。 由于可以从 apport 报告中提取数据,您几乎肯定不希望启用对未打包代码的 apport 处理。 您的唯一选择是禁用 ap­port。 为此,请编辑 etc/de­fault/ap­port,然后编辑 en­abled= 行: enabled=0 ◆ 创建文件 /etc/sysctl.d/30-core-pattern.conf(或该目录中的任意相似名称)。 在该文件中添加: kernel.core_pattern=/cores/core.%p.%e 确保您指定用于保存核心文件的目录可公开并写入,并且有足够的磁盘空间。 请参见 man core 了解更多选项。 ◆ 您应该设置 /proc/self/coredump_filter 以控制转储到核心文件中的内存数量。 这可以在 /etc/profile.d/something.sh 文件中进行设置。 命令为: # echo 0x33 >/proc/self/coredump_filter↩ 所使用的具体 bit 映射取决于您希望收集的数据级别。 bit 的含义可以在 man core 中找到,对于 Caché 有意义的示例为: Bit 说明 InterSystems 是否需要 0x01 匿名私有映射。 始终需要。 0x02 匿名共享映射。 复杂问题需要。 0x04 文件支持的私有映射。 $ZF() 相关问题可能需要。 0x08 文件支持的共享映射。 $ZF() 相关问题可能需要。 0x10 转储 ELF 标头。 始终需要。 0x20 转储私有大页。 In­ter­Sys­tems 当前未使用。 0x40 转储共享大页。 In­ter­Sys­tems 当前未使用。 0x80 转储私有 DAX 页 (16.04LTS)。 In­ter­Sys­tems 当前未使用。 0x100 转储共享 DAX 页 (16.04LTS)。 In­ter­Sys­tems 当前未使用。 作为将此命令放在 shell 特定的脚本中的替代方案,您可以在启动期间进行修改。 只有使用 grub2 引导时,这些指令才适用。 您可以通过以下命令测试: # grub-install --version↩ grub-install (GRUB) 2.02-2ubuntu8.12­ 编辑 /etc/de­fault/grub。 更改以 GRUB_CMDLINE_LINUX_DEFAULT= 开头的行。 如果文件中不存在该行,则在末尾添加。 它应该包含: GRUB_CMDLINE_LINUX_DEFAULT="oldcmd coredump_filter=newval " 注意:old­cmd 是 GRUB_CMD­LINE_LINUX_DE­FAULT 的旧值(如果该行先前不存在,则省略)。 new­val 是 core­dump_fil­ter 的新值,以十六进制表示,带有前导“0x”。 运行: # grub-mkconfig -o /boot/grub2/grub.cfg↩ ◆ 您应该针对所有进程设置ulimit -c 为无限制。 这可以在文件 /etc/security/limits.conf 中进行全局设置。 添加以下两行: * soft core unlimited * hard core unlimited macOS(OS X、Darwin) Mac OS X 曾重命名为 OS X,后来又重命名为 ma­cOS。 所有这些操作系统均是 Ap­ple 在 Darwin 上堆叠的专有用户界面,Darwin 是 Ap­ple 从 BSD Unix 衍生出来的操作系统,理论上已发布到公共领域。 然而,以 Ap­ple 发布 Dar­win 的方式,实际上没有人会只运行 Dar­win。 In­ter­Sys­tems 产品只需要 Dar­win,但由于 Dar­win 实际上不可用,因此所有说明均基于完整的 Apple Mac OS X、OS X 或 macOS。 ma­cOS 包括 CrashRe­porter。 该工具可以自动拦截进程故障,将故障详细信息打包为文本日志,然后将数据发送给 Apple 进行分析。 CrashReporter 将捕获第三方软件(如 Caché、Ensemble、HealthShare 和 InterSystems IRIS 数据平台)的进程故障详细信息。 理论上,Ap­ple 可将这些信息转发给 In­ter­Sys­tems。 InterSystems 没有从 Ap­ple 收到 CrashReporter 日志,我们也没有开发分析这些日志的功能。 In­ter­Sys­tems 产品严格地生成核心文件。 幸运的是,CrashReporter 独立于核心文件创建。 也就是说,处理进程故障可以通过 CrashReporter 和核心文件创建这两种方式中的任意一种或两种,或者都不使用。 CrashReporter 设置可以在“系统偏好设置”→“安全和隐私”、“隐私”选项卡中设置。 面板名称和框的选择因版本而异。 在 Mac OS X 10.4 中,该面板的名称仅为“安全性”,没有相关的复选框。 在较旧的版本中,发生任何进程故障时都会向用户显示一个对话框,询问他们是否要将数据发送到 Ap­ple 进行分析。 根据您处理的数据的敏感性,您可能想要取消选中与 CrashReprter 相关的所有选项。 ◆ 在 macOS 中,启用生成核心文件的方法在不同版本之间有很大变化。 请参见下表,并使用适合您的版本的方法。 版本 代号 InterSystems 版本 方法 公测版 Kodiak 不支持 方法 1:编辑 /hostconfig Mac OS X 10.0 Cheetah 不支持 Mac OS X 10.1 Puma 不支持 Mac OS X 10.2 Jaguar 不支持 Mac OS X 10.3 Panther Caché (PowerPC) 5.0, 5.1 Mac OS X 10.4 Tiger Caché(标记 PowerPC 或 x86)5.0PowerPC, 5.1PowerPC, 5.2*, 2007.1*, 2008.1x86, 2008.2x86, 2009.1x86 方法 2:编辑 /etc/launchd.conf Mac OS X 10.5 Leopard Caché (x86) 2008.1, 2008.2, 2009.1, 2010.1 Mac OS X 10.6 Snow Leopard Caché (x86–64) 2010.1, 2010.2, 2011.1, 2012.1, 2012.2 Mac OS X 10.7 Lion Caché (x86–64) 2011.1, 2012.1, 2012.2, 2013.1, 2014.1 OS X 10.8 Mountain Lion Caché (x86–64) 2012.2, 2013.1, 2014.1, 2015.1 OS X 10.9 Mavericks Caché (x86–64) 2013.1, 2014.1, 2015.1, 2015.2, 2016.1, 2016.2 OS X 10.10 Yosemite Caché (x86–64) 2014.1, 2015.1, 2015.2, 2016.1, 2016.2 方法 3:非自动。 OS X 10.11 El Capitan Caché (x86–64) 2016.1, 2016.2, 2017.1DEV,2017.2DEV, 2018.1DEV macOS 10.12 Sierra Caché (x86–64) 2017.1, 2017.2, 2018.1 macOS 10.13 High Sierra Caché (x86–64) 2018.1, 2019.1, 2019.2 macOS 10.14 Mojave IRIS 2019.1, 2019.2 macOS 10.15 Catalina 未发布 **方法 1:**对于 OS X 10.3 (Chee­tah) 以及先前不受支持的版本:编辑文件 /host­con­fig。 查找行 CORE­DUMPS=,然后将值更改为 -YES-。 COREDUMPS=-YES- ◆ **方法 2:**对于 OS X 10.4 (Tiger) 到 OS X 10.9 (Mav­er­icks) 版本,编辑文件 /etc/launchd.conf,然后添加以下行: limit core unlimited 重新启动。 ◆ **方法 3:**对于 OS X 10.10 (Yosemite) 及更高版本,/etc/launchd.conf 已去除。 核心文件生成现在是半禁用状态。 用户必须为每个进程启用核心: % ulimit -c unlimited↩ 在允许他们的应用程序之前,特权用户必须运行: # launchctl limit core unlimited↩­­­ 然后注销,并在启动 Caché 前再次登录。 Apple 特地没有提供一个好方法来自动执行这些操作,因为他们认为默认生成核心文件是一个潜在的安全漏洞。 Apple 提供了完全禁用核心文件生成的方法。 这通过编辑文件 /etc/sysctl.conf 并添加以下行来完成: kern.coredump=0 可以通过删除该行或将值更改为 `1` 来重新启用此功能。 OpenVMS 默认情况下,Caché 和 En­sem­ble 只针对故障进程生成 CACCVIO-pid.LOG 文件。 使用这些文件只能解决相对简单的问题。 这些 CACCVIO-pid.LOG 文件将始终放在进程默认目录中(通常是 CACHE.DAT 文件的目录),只有通过更改进程默认目录才能重定向。 Caché 和 En­sem­ble 也可能生成 CERRSAVE-pid.LOG文件。 这些文件与 CACCVIO-pid.LOG 文件类似。 通常,您无需关心它们的差异。 在某些情况下,Caché 和 En­sem­ble 将同时生成两种文件以响应故障。 在迄今为止的所有情况下,CACCVIO-pid.LOG 文件首先生成,其中包含错误的完整上下文,而 CERRSAVE-pid.LOG` 文件则在进程的最后断开过程中生成,包含的有价值的信息相对较少。 如果启用了扩展进程 dumps(完整转储),它们也会放置在进程默认目录中。 但是,可以将它们重定向,方法是定义逻辑名称 SYS$PROCDMP,将其指向要存储进程dump的目录。 该逻辑名称可以在 /SYS­TEM 级别定义。 文件名将是 CACHE.DMP 或 CSESSION.DMP。 Open­VMS 还提供了逻辑名称 SYS$PROTECTED_PROCDMP。 您也应该使用 /EX­EC­U­TIVE_MODE 和 /SYS­TEM 定义该逻辑名称。 这适用于特权映像privileged images的进程故障,Caché 的某些部分也拥有特权。 OpenVMS 文档中建议将这两个逻辑名称定义到不同的目录,并为与 SYS$PRO­TECTED_PROCDMP 对应的目录设置更高的安全性。 这基于以下假设:特权映像处理的数据比非特权映像处理的数据更敏感。 如果两种数据都很敏感,将两个逻辑名称指向同一目录也是可以的。 ◆ 影响 CACCVIO-pid.LOG 和 CERRSAVE-pid.LOG 文件创建以及完整进程dump的缺陷是有历史记录的。 以下是最重要的变更。 变更 第一个版本 说明 JLC1809 Caché 2015.2 在此变更之前,大多数 CERRSAVE-pid.LOG 文件是无用的。 JO2422 Cache 2012.1 在此变更之前,生成 CERRSAVE-pid.LOG 文件的条件在创建信息有限的文件时总是会忽略 DumpStyle。 JLC1326 Caché 2011.1 在此变更之前,Itanium 平台上的 CACCVIO-pid.LOG 和 CERRSAVE-pid.LOG 文件不包含寄存器。 这严重阻碍了我们使用这些文件解决问题的能力,而只能处理简单问题。 我们仍然可以与已经解决的问题相匹配。 JLC931 和 JLC959 Cache 2007.2 在此变更之前,Itanium 平台上的 CACCVIO-pid.LOG 和 CERRSAVE-pid.LOG 文件不记录任何有用信息。 JO1968 Caché 5.2 在此变更之前,生成 CACCVIO-pid 文件的条件在创建信息有限的文件时总是会忽略 DumpStyle。 ­­ Solaris 可以使用以下命令使核心文件放在公用目录中并带有扩展名称: # coreadm -e global -g /cores/core.%p.%f -G all↩ ① %p 表示将 pid 放在路径名中。 ② %f 表示将可执行文件名(如 cache)放在路径名中。 ③ -G all 表示包括所有类型的内存,即完整核心文件内容。 省略此选项将生成默认核心文件内容,其中仍包括大部分共享内存。 核心文件中可以存储以下内容: 代码 InterSystems 使用 默认包括 stack 需要 是 heap 需要 是 shm 不使用 是 ism 不使用 是 dism Caché 共享内存 是 text 用于 $ZF() 相关故障 是 data 需要 是 rodata 不使用 是 anon 需要 是 shanon 通常较小 是 ctf 需要 是 symntab 用于 $ZF() 相关故障 否 shfile 不使用 否 all 表示包括所有类型的内存,默认不包括最后两种。 如果您需要大幅减小的核心文件大小(以节省空间,但代价是可解决的问题变少),移除 dism 共享内存可节省出大部分空间。 使用以下命令执行此操作: # coareadm -e Global -g /cores/core.%p.%f -G (default-dism)↩ 请参见: % main 1m coreadm↩ ◆ 默认情况下,用户已经 % ulimit -c unlimited↩ 您可以使用 ulimit(或在 csh 中使用 limit 命令)禁用核心,但 core­adm 通常更灵活。 因此您应该确保 ulimit 命令不会出现在 /etc/profile 或 $HOME/.profile 中,或者其他 shell 的相应文件中。 Windows Windows 下的转储文件中包含的信息完全由 cache.cpf 文件中的 DumpStyle 参数(或上文定义的其他用于更改 DumpStyle 的接口)控制。 测试 除了特定问题外,本地安全组也可能阻止核心文件的写入。 在真实条件下测试是否可以成功创建核心文件非常有用。 为此,请输入命令: USER>DO $ZUTIL(150,"DebugException")↩ 可以肯定的是,您应该在 JOB 内以交互方式测试该语句(假定您的应用程序使用 JOB 命令),甚至在应用程序内隐藏一个不会被用户意外选择到的选项。 验证是否会获得核心文件,并按照下一节的健全性检查来验证它是否是好的核心文件。 健全性测试 核心文件(和进程转储)可能非常大,并且可能包含敏感信息。 在将核心文件传输到 InterSystems 进行分析之前,最好在生成核心文件的系统或非常相似的系统上对核心文件进行健全性测试。 根据您的操作系统,请执行以下健全性测试: 操作系统 健全性测试 AIX # dbx cache core(dbx) set $stack_details(dbx) where(dbx) quit 向 WRC 开启问题时,将上述命令的输出结果也同时发送给我们。 如果您的系统未安装 dbx,则开启一个新问题。 HP–UX # gdb cache core(gdb) frame 0(gdb) while 1 > info frame > up > end(gdb) quit # adb coreadb> $cadb> $q 根据您拥有的调试器,将上述两个命令集的其中之一的输出结果发送给我们。 如果两个调试器都有,则首选 gdb(实际是 Wildebeest)。 RedHat Linux 对于所有版本的 Linux 都使用此通用健全性测试。 # gdb cache core(gdb) frame 0(gdb) while 1 > info frame > up > end(gdb) quit SuSE Linux Ubuntu Linux 向 WRC 开启问题时,将上述命令的输出结果发送给我们。 如果您的系统未安装 gdb,则开启一个新问题。 macOS (Darwin) # lldb(lldb) target create -c core(lldb) thread backtrace all(lldb) quit # gdb cache core(gdb) frame 0(gdb) while 1 > info frame > up > end(gdb) quit 将 lldb 的输出结果(如果是 OS X 10.8 (Mountain Lion) 或更高版本)或 gdb 的输出结果(如果是 Mac OS X 10.7 (Lion) 或更早版本)发送给我们。 OpenVMS $ ANALYZE/CRASH dumpfile.DMPSDA> SHOW CALL_FRAME/ALL如果仍在运行 OpenVMS v7.x 或更早版本,先前的命令不适用,请改用:SDA> SHOW CALL_FRAMESDA> SHOW CALL_FRAME/NEXT重复先前的命令,直到获得错误。SDA> QUIT $ ANALYZE/PROCESS dumpfile.DMPDBG> SHOW CALL/IMAGEDBG> QUIT 将 SDA 或debugger调试器的输出结果发送给我们,但首选 SDA 的输出。 如果您仅有 CACCVIO-pid.LOG 文件,请检查其是否为空或几乎为空。 Solaris # mdb cache core> ::stackregs> ::quit # dbx cache core(dbx) where(dbx) quit 在 Solaris 上,InterSystems 对于几乎所有应用程序都首选 dbx 调试器,但对于健全性测试,mdb 更好。 当您向 WRC 开启问题报告时,请将 mdb 或 dbx(首选 mdb)生成的堆栈跟踪信息发送给我们。 Windows 对于 Windows 进程转储,当前没有推荐的健全性检查。 请将健全性测试的详细信息附加到 WRC 案例,或通过电子邮件发送到support@intersystems.com 。 传输 请准备好向我们发送完整核心文件以及您的特定操作系统可能需要的支持文件。 我们需要知道生成了核心文件的 Caché、Ensemble、HealthShare 或 InterSystems IRIS 数据平台的准确版本。 如果您重定向了软件并包含自定义的 `$ZF()` 函数,请发送可执行文件。 (实际上,如果您总是发送可执行文件,会更加方便。) 在大多数 Unix 系统上,最好还发送可执行文件使用的库。 我们需要库的可能性因给定的平台而异。 请查阅下表: 操作系统 硬件 需要库 支持级别 AIX PowerPC 不太可能 A HP–UX PA–RISC 非常可能 C HP–UX Itanium 有可能 A Linux(所有版本) x86 有可能 A Linux(所有版本) x86_64 有可能 A Linux(所有版本) Itanium 有可能 D macOS PowerPC 不太可能 D macOS x86 不太可能 C macOS x86_64 不太可能 A OpenVMS VAX 不适用 D OpenVMS ALPHA αxp 不适用 B OpenVMS Itanium 不适用 B Solaris x86_64 非常可能 B Solaris Sparc 不太可能 B Tru64 UNIX ALPHA αxp 非常可能 D Windows x86 不适用 A Windows x86_64 不适用 A Windows Itanium 不适用 D 支持级别说明 A: 截至本文档发布之时,InterSystems 拥有用于诊断该平台上的核心文件的资源。B: 对该平台的完全支持在最近失效。 不过,InterSystems 仍然有资源来诊断平台上的核心文件。 某些诊断出的问题可能无法使用专门版本更正。C: 旧版支持。 InterSystems 可能仍然拥有有限的资源来诊断该平台上的核心文件,但是,可能无法再提供专门版本来修复所发现的任何缺陷。D: 远古支持。 In­ter­Sys­tems 未保留任何可诊断这些平台上的问题的资源。 不过一些有限的功能仍保留下来。 这些平台上的核心可能会被分析。 但不可能修复所发现的任何缺陷。 发出 ldd 命令可列出所需的库: # ldd install_directory/bin/image linux-vdso.so.1 => (0x00007fffd1320000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f23e5002000) librt.so.1 => /lib64/librt.so.1 (0x00007f23e4dfa000) libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f23e4af0000) libm.so.6 => /lib64/libm.so.6 (0x00007f23e47ee000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f23e45d8000) libc.so.6 => /lib64/libc.so.6 (0x00007f23e4216000) /lib64/ld-linux-x86-64.so.2 (0x00007f23e521a000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f23e3ffa000) 上面的内容包含 Rhel 7 的示例输出。 所有 Unix 系统的输出都是类似的。 install_directory`指 Caché、Ensemble、HealthShare 或 InterSystems IRIS 数据平台的安装目录。 image 对于 2018 年以前的所有产品均为 cache,对于自 2019 年以后的产品为 irisdb。如果您要发送多个文件,最好将它们放在一个压缩的容器文件中。 一般来说,.ZIP是最好的容器。 .tar.gz 也是合理的。 对于 Open­VMS,使用以下命令创建备份文件: $ BACKUP *.* [-]<var>saveset</var>.BCK/SAVE/DATA=COMPRESS 包含一个说明所发送文件的manifest会有帮助。 请准备纯文本文件形式的manifest。如果以电子方式发送数据,请不要加密文件,而是使用加密的传输方式。 您可以使用以下任意方法向 InterSystems 发送核心文件: 方法 安全性 最大大小 直接上传至 WRC 应用。上传文件前,必须开启一个 WRC 问题,上传文件后,可以选择将问题标记为更高安全性。 问题标记为更高安全性后,所有对与调查相关的文件的访问都仅限于实际进行调查的人员。 除了 300 M 的附件大小限制外,还有 60 秒的时间限制,因此如果您的有效带宽小于 42 Mbps,最大上传量会减少 安全或更高 300 M 和 60 秒 电子邮件。一般来说,除了不需要任何客户数据就可以进行调查的简单问题,应避免使用电子邮件。 示例:您刚刚在一台新计算机上安装了 Caché,但它在启动时出现故障,并生成一个小核心文件。 通过电子邮件发送该文件是合理的。 不安全 40 M 我们的 kite-works 服务器。对于任何给定问题,您都必须申请数据上传链接。 这些链接在 30 天或更短时间内过期。 这是上传安全数据的首选方法。 绝对大小限制是我们服务器上的可用空间。 但是,由于大多数客户都使用这种方法,如果您要上传大于 4G 的文件,请事先告知。 安全 > 4 G 我们的 sftp 服务器。您必须申请特定于用于问题的目录。 将为问题创建一个目录。 对于更高安全性的问题,我们创建了一个限制访问的机器(或虚拟机),并实现了一个自动流程将上传的任何文件都移动到该机器。 绝对大小限制是指我们服务器上的可用空间,如果您要上传大于 100 G 的文件,请事先告知。 更高 > 100 G 您的 ftp/sftp 服务器。您要求我们从中下载数据的服务器必须归您所有,并且您有完全控制权。 In­ter­Sys­tems 不会从任何第三方服务器下载数据。 第三方服务器被视为安全风险。 取决于您 ? Se­curLink。InterSystems 可以通过我们的 SecurLink 远程控制工具直接从您的网络上的任何已核准的计算机中下载文件。 没有绝对大小限制。 但是,如果您通过 V.90 调制解调器连接到互联网,我们下载一个 3 Gio 的核心文件需要一周的时间。 安全且更高 ? 物理介质。您可以将物理介质邮寄到您当地的 In­ter­Sys­tems 办公室。 InterSystems 可以读取介质,并将数据发送到我们的剑桥办公室,在那里进行大多数核心文件分析。 大多数办公室都可以处理 U 盘以及 ISO 9660 光盘介质。 我们的剑桥办公室可以处理多种磁带格式。 在发送任何介质之前,您应该先与 InterSystems 确认。如果通过挂号(非认证)邮件发送介质,那么数据可以被认为是安全的(可能安全性更高)。 视情况 ? 务必要记住,我们需要的文件有些是二进制文件,有些是文本文件。 对于某些文件传输方法(尤其是在不同的操作系统之间),必须指定文件是二进制还是文本,以防止文件被损坏。 索引 a ABRT ☞, ☞AppArmor ☞abrtd ☞abrt-cli ☞apport ☞ b BlackListedPaths ☞ c CACCVIO-pid.LOG ☞, ☞CACHE.DMP☞, ☞CERRSAVE-pid.LOG ☞CentOS ☞CORE_NOSHM ☞CrashReporter ☞CSESSION.DMP ☞cachefpid.dmp ☞pid.dmp ☞cachempid.dmp ☞cache.cpf ☞, ☞chcore ☞chdev ☞chkconfig ☞coreadm ☞, ☞coredumpctl ☞core_addshmem_read ☞core_addshmem_write ☞cstat ☞ d DumpStyle ☞, ☞default ☞ e /etc/environment ☞/etc/profile.d/something.sh ☞, ☞, ☞/etc/security/limits ☞/etc/security/limits.conf ☞, ☞, ☞/etc/sysctl.d ☞ f FULL ☞ g GRUB_CMDLINE_LINUX_DEFAULT ☞, ☞grub2 ☞, ☞grub2-mkconfig ☞ i INTERMEDIATE ☞irisstat ☞iris.cpf ☞, ☞ l lsattr ☞ m MINIMAL ☞maxdsiz_64bit ☞ n NOCORE ☞NOFORK ☞NOFORKNOSHARE ☞NOHANDLER ☞NORMAL ☞ o OpenGPGCheck ☞ p ProcessUnpackaged ☞pid.dmp ☞/proc/self/coredump_filter☞, ☞, ☞/proc/sys/kernel/core_pattern ☞, ☞, ☞ r RPM ☞rcapparmor ☞ s SYS$PROCDMP ☞SYS$PROTECTED_PROCDMP ☞$SYSTEM.Config.ModifyDumpStyle ☞敏感信息 ☞smit ☞systemd ☞ u ulimit -c ☞, ☞, ☞, ☞/usr/sbin/kctune ☞ y yast2 ☞ z $ZUTIL(40,1,48) ☞$ZUTIL(40,2,165)☞$ZUTIL(150,"DebugException") ☞ get
文章
姚 鑫 · 三月 18, 2021

第十二章 使用嵌入式SQL(二)

# 第十二章 使用嵌入式SQL(二) # 嵌入式SQL代码 ## 简单的SQL语句 可以将简单的SQL语句(单个嵌入式SQL语句)用于各种操作,包括: - `INSERT`,`UPDATE`,`INSERT OR UPDATE`和`DELETE`语句。 - `DDL语句。 - `GRANT`和`REVOKE`语句。 - 只返回一行的`SELECT`语句(或者如果只对返回的第一行感兴趣)。 简单的SQL语句也被称为非基于游标的SQL语句。本章稍后将介绍基于游标的嵌入式SQL。 例如,以下语句查找ID为43的(唯一的)患者的姓名: ```sql &sql(SELECT Name INTO :name FROM Patient WHERE %ID = 43) ``` 如果对可以返回多行的查询使用简单语句,则只返回第一行: ```sql &sql(SELECT Name INTO :name FROM Patient WHERE Age = 43) ``` 根据查询的不同,不能保证哪一行将首先被返回。此外,如果一个查询包含一个`INTO`语句,并且该表不包含任何数据(`SQLCODE=100)`,执行该查询将导致未定义(空)的输出主机变量。因此,在访问输出主机变量之前,所有简单嵌入式SQL语句都应该测试`SQLCODE=0`。 ## 架构名称解析 表名,视图名或存储过程名是合格的(指定架构名称)或不合格的(不指定架构名称)。如果名称未指定架构名称,则InterSystems IRIS会按以下方式解析架构名称: - 数据定义:InterSystems IRIS使用系统范围内的默认架构来解析不合格的名称。如果默认模式不存在,则InterSystems IRIS将创建模式和相应的类包。所有数据定义语句都使用系统范围内的默认架构。数据定义语句忽略`#Import`和`#SQLCompile Path`宏预处理程序指令。 - 数据管理:InterSystems IRIS对包含嵌入式SQL语句的类或例程使用`#SQLCompile`路径和/或`#Import`宏预处理程序指令指定的架构搜索路径。 `#Import`和`#SQLCompile Path`指令是具有不同功能的可能模式名称的相互独立列表。二者之一或两者均可用于为不合格的表,视图或存储过程名称提供架构名称。如果未指定架构搜索路径,则InterSystems IRIS将使用系统范围的默认架构名称。 ## 文字值 嵌入式SQL查询可能包含文字值(字符串,数字或日期)。字符串应用单引号(`'`)引起来。 (在InterSystems SQL中,双引号指定分隔的标识符): ```java /// d ##class(PHA.TEST.SQL).EmbedSQL4() ClassMethod EmbedSQL4() { &sql(SELECT 'Employee (' || Name || ')' INTO :name FROM Sample.Employee) IF SQLCODEd ##class(PHA.TEST.SQL).EmbedSQL4() Employee (Adams,Susan E.) ``` 数值可以直接使用。在InterSystems IRIS将这些文字值与字段值进行比较之前,先对文字数字和时间戳值进行`“lightly normalized”`,如以下示例所示,其中`+0050.000`被格式化为`50`: ```java /// d ##class(PHA.TEST.SQL).EmbedSQL5() ClassMethod EmbedSQL5() { &sql(SELECT Name,Age INTO :name,:age FROM Sample.Person WHERE Age = +0050.000) IF SQLCODEd ##class(PHA.TEST.SQL).EmbedSQL5() Russell,Quentin V. age=50 ``` 可以指定算术、函数和特殊变量表达式: ```java /// d ##class(PHA.TEST.SQL).EmbedSQL6() ClassMethod EmbedSQL6() { &sql(DECLARE C3 CURSOR FOR SELECT Name, Age - 65, $HOROLOG INTO :name,:retire,:today FROM Sample.Person WHERE Age > 60 ORDER BY Age, Name) &sql(OPEN C3) QUIT:(SQLCODE'=0) &sql(FETCH C3) WHILE (SQLCODE = 0) { WRITE $ZDATE(today)," ",name," has ",retire," eligibility years",! &sql(FETCH C3) } &sql(CLOSE C3) } ``` ```java DHC-APP>d ##class(PHA.TEST.SQL).EmbedSQL6() 03/13/2021 Moon,Rhonda T. has -4 eligibility years 03/13/2021 Olsen,Ashley G. has -4 eligibility years 03/13/2021 Quixote,Terry J. has -4 eligibility years 03/13/2021 Yoders,Liza U. has -4 eligibility years 03/13/2021 Gore,Alfred M. has -3 eligibility years 03/13/2021 Houseman,Alice R. has -2 eligibility years 03/13/2021 Nichols,Heloisa M. has -2 eligibility years 03/13/2021 Houseman,Martin D. has 0 eligibility years 03/13/2021 LaRocca,David X. has 0 eligibility years 03/13/2021 Ng,Liza Z. has 0 eligibility years 03/13/2021 Smith,Elvis Y. has 0 eligibility years ``` 在嵌入式SQL中,字符串文字中不允许使用以`##`开头的一些字符序列,而必须使`##lit`指定。这些字符序列是`##;`, `##beginlit`, `##expression(`, `##function(`, `##quote(`, `##stripq(`, and `##unique(`。例如,以下示例失败: ```java ClassMethod EmbedSQL7() { WRITE "Embedded SQL test",! &sql(SELECT 'the sequence ##unique( is restricted' INTO :x) WRITE x } ``` 以下解决方法成功: ```java /// d ##class(PHA.TEST.SQL).EmbedSQL7() ClassMethod EmbedSQL7() { WRITE "Embedded SQL test",! &sql(SELECT 'the sequence ##lit(##unique() is restricted' INTO :x) WRITE x } ``` ```java DHC-APP>d ##class(PHA.TEST.SQL).EmbedSQL7() Embedded SQL test the sequence ##unique( is restricted ``` ## 数据格式 在嵌入式SQL中,数据值处于`“逻辑模式”`。也就是说,值采用SQL查询处理器使用的本机格式。对于未定义`LogicalToODBC`或`LogicalToDisplay`转换的字符串,整数和其他数据类型,这无效。数据格式会影响`%List`数据以及`%Date`和`%Time`数据类型。 `%List`数据类型在逻辑模式下显示为以非打印列表编码字符开头的元素值。 `WRITE`命令将这些值显示为连接的元素。例如,`Sample.Person`的`FavoriteColors`字段以`%List`数据类型存储数据,例如:`$LISTBUILD('Red','Black')`。在嵌入式SQL中,这在逻辑模式下显示为`RedBlack`,长度为12个字符。在“显示”模式下,它显示为`“Red,Black”`;在ODBC模式下,它显示为`Red,Black`。在下面的示例中显示: ```java /// d ##class(PHA.TEST.SQL).EmbedSQL8() ClassMethod EmbedSQL8() { &sql(DECLARE C4 CURSOR FOR SELECT TOP 10 FavoriteColors INTO :colors FROM Sample.Person WHERE FavoriteColors IS NOT NULL) &sql(OPEN C4) QUIT:(SQLCODE'=0) &sql(FETCH C4) WHILE (SQLCODE = 0) { WRITE $LENGTH(colors),": ",colors,! &sql(FETCH C4) } &sql(CLOSE C4) } ``` ```java DHC-APP>d ##class(PHA.TEST.SQL).EmbedSQL8() 21: ReOrangYellow 28: ReOrangYellowGreen 35: ReOrangYellowGreenGreen 36: ReOrangYellowGreeYellow 7: White 7: Black 14: GreenWhite 8:Purple 8:Yellow 10: RedRed ``` InterSystems IRIS提供的`%Date`和`%Time`数据类型使用InterSystems IRIS内部日期表示形式(`$HOROLOG`格式)作为其逻辑格式。 `%Date`数据类型在逻辑模式下返回INTEGER数据类型值;在“显示”模式下为`VARCHAR`数据类型值,在`“ODBC”`模式下为`DATE`数据类型值。 `%TimeStamp`数据类型的逻辑,显示和`ODBC`格式使用`ODBC日期-时间`格式(`YYYY-MM-DD HH:MM:SS`)。 例如,考虑以下类定义: ```java Class MyApp.Patient Extends %Persistent { /// Patient name Property Name As %String(MAXLEN = 50); /// Date of birth Property DOB As %Date; /// Date and time of last visit Property LastVisit As %TimeStamp; } ``` 针对该表的简单嵌入式SQL查询将以逻辑模式返回值。例如,考虑以下查询: ```java &sql(SELECT Name, DOB, LastVisit INTO :name, :dob, :visit FROM Patient WHERE %ID = :id) ``` 该查询将三个属性的逻辑值返回到主机变量名称,`dob`和`visit`中: 主机变量| 值 ---|--- name| "Weiss,Blanche" dob| 44051 visit| "2001-03-15 11:11:00" 请注意,`dob`是`$HOROLOG`格式。可以使用`$ZDATETIME`函数将其转换为显示格式: ```java SET dob = 44051 WRITE $ZDT(dob,3),! ``` 与`WHERE`子句中的true相同的考虑因素。例如,要查找具有给定生日的患者,必须在WHERE子句中使用逻辑值: ```java &sql(SELECT Name INTO :name FROM Patient WHERE DOB = 43023) ``` 或者,使用主机变量: ```java SET dob = $ZDH("01/02/1999",1) &sql(SELECT Name INTO :name FROM Patient WHERE DOB = :dob) ``` 在这种情况下,我们使用`$ZDATEH`函数将显示格式日期转换为其等效的`$HOROLOG`逻辑值。 ## 权限检查 嵌入式SQL不执行SQL特权检查。可以访问所有表,视图和列,并执行任何操作,而不管特权分配如何。假定使用嵌入式SQL的应用程序将在使用嵌入式SQL语句之前检查特权。 可以在嵌入式SQL中使用InterSystems SQL `%CHECKPRIV`语句来确定当前权限。
公告
Claire Zheng · 三月 11, 2021

欢迎中文社区新版主@姚鑫

亲爱的社区开发者们, 我很高兴地向大家介绍一位我们的新版主@姚鑫 @姚鑫是东华医为的一名开发工程师。 以下是@姚鑫的自我介绍: 大家好,我非常热衷于与开发者们分享我的技术经验。作为一名移动端全栈开发工程师,我发表了《Caché 23种设计模式》《Caché 算法与数据结构》《Caché 从入门到精通》《疯狂 Caché》《Caché 命令大全》《Caché 函数大全》《Caché 变量大全》《Caché SQL 必知必会》等一系列文章集。 在CSDN(中国最大的开发者社区之一),我被认证为博客专家,CSDN优秀讲师。 在掘金网这个帮助开发者成长的知名社区,获得了2020年掘金十大年度人气作者称号。 我很荣幸能够加入InterSystems开发者社区(中文版)并参与到社区管理、运营中,希望可以同使用InterSystems技术的开发者更好地交流、共同成长。 感谢@姚鑫,恭喜你成为新版主! 感谢@姚鑫!期待更多大作! 欢迎新版主@姚鑫 欢迎新版主@姚鑫期待将来分享更多关于IRIS数据平台的经验
文章
Lele Yang · 六月 8, 2021

FAQ 常见问题系列--应用篇 升级系统后打开管理门户SMP报错5001

如果您在升级了系统之后,打开SMP时看到如下报错,ERROR #5001: 对象的服务器版本与客户端发送的版本不一致: %ZEN.Component.vgroup 一般情况下,这个报错是由浏览器缓存中残留的过期信息造成的,可以通过清除浏览器缓存来解决。 如果清除浏览器缓存之后仍然未能解决此问题,请您前往系统安装目录, 如:d:\InterSystems\IRIS\CSP\broker,查看css/js文件的时间戳在本次更新安装之后是否并没有相应地更新,如果没有,请您做以下尝试,1)在IRIS中更改数据库IRISLIB, 之前的版本是CACHELIB, 取消只读装载,方法如下,打开管理门户SMP, 系统管理->配置->本地数据库,选择要更改的数据库,取消"只读方式挂载",点击【保存】。2)重新编译%Zen组件,w ##class(%SYSTEM.OBJ).Compile("%ZEN.Component.vgroup")此时,再次前往,d:\InterSystems\IRIS\CSP\broker,会看到相关的css/js文件时间戳已经更新。3)恢复上述数据库的只读装载。 如果以上办法仍然未能解决您的问题,建议您联系WRC,寻求Support的进一步帮助。
文章
Michael Lei · 八月 10, 2023

如何比较两个数据库中的多个Global和Routines

InterSystems 常见问题解答 ※如果您想比较使用Mirror、Shadow或其他机制复制的数据库,请使用此方法。 您可以使用 DATACHECK 实用程序来比较Global。请参阅下面的文档。DataCheck 概述 [IRIS] *** Routines比较使用系统例程 %RCMP 或管理门户。 以下是如何在管理门户中使用它。 例如,假设以下Routine位于 USER 命名空间中。 test() public{ quit "hello" } 假设以下Routine位于 USER2 命名空间中。 test() public{ quit "Hello" } 下面是在连接到 USER 命名空间的终端中运行 %RCOM 的结果。 * 在Compare : 中写入Routine名称以及要与: 进行比较的Routine名称要指定另一个命名空间中的Routine,请指定|“命名空间名称”|例程名称.MAC。 用户>执行 ^%RCMP比较:comptest.mac 与:|"USER2"|comptest.macCompare: // [备注] 如果没有可比较的内容,请按 Enter忽略评论差异?否 => 否忽略前导空格?否 => 否显示结果于Device: c:\temp\comp.txt // [备注] 指定文件名时的文件输出 参数? (“WNS”)=>comptest.MAC |“USER2”|comptest.MAC****************************************************** ******************************用户> 对比结果如下。 常规比较 2021 年 2 月 2 日 2:31 PM来自目录:c:\intersystems\iris\mgr\user\ comptest.MAC |“USER2”|comptest.MAC****************************************************** ******************************竞争测试.MAC+2 退出“你好”......................|“USER2”|comptest.MAC+2 退出“你好”****************************************************** **************************
文章
Jingwei Wang · 八月 25, 2021

Object Script 基础知识(二)

Object Script(二) 特殊符号 ObjectScript没有定义任何保留字:你可以自由地使用任何字作为标识符(如变量名)。为了达到这个目的,ObjectScript使用了一组内置的命令以及特殊的字符(比如函数名的"$"前缀),以便将标识符与其他语言元素区分开来。 示例 含义 abc^def 调用routine中的一个标签: def是一个routine,abc是该routine中的一个标签。 i%abcdef i%<PropertyName> 用于从实例变量自身的Get或Set访问器方法中引用该变量,或者绕过其Get或Set方法 abc->def 这种语法只在InterSystems的SQL语句中可以使用。它指定了一个隐含的左外连接。abc是你正在查询的类中的一个对象值字段,def是子类中的一个字段。 abc?def 一个问号是模式匹配操作符,测试变量abc中的值是否与def中指定的模式相匹配 abc[def 左括号([)是二进制包含运算符。这个表达式检测字符串"abc "是否包含字符串 "def" abc]def 右括号(])是二进制跟随运算符。这个表达式检测字符串"abc "是否在字符串 "def "之后,以ASCII的顺序排列。 abc]]def 两个右括号(]])是二进制排序运算符。这个表达式检测字符串 "abc "是否排在字符串 "def "之后,以数字下标排序。 .. 相对点语法,两个句号组成,是一个类成员内部对另一个类成员的引用的开始。或者用于访问当前对象的一个属性或调用一个方法 ##Class() 用于调用一个类的方法,将一个对象引用转换为另一个类来调用一个方法,或者用于访问一个类参数的值。 ##super 用于从子类方法中调用父类方法 $abc 系统变量或自定义变量 $abc() 系统函数或者自定义函数,括号中可用逗号分隔参数 $abc.def.ghi(xxx) $abc是$SYSTEM,def是%SYSTEM包中的类的名称,ghi是该类中一个方法的名称,xxx是该方法的一个可选的逗号分隔的参数列表 $SYSTEM是%SYSTEM包的别名,用来提供对该包中类的方法的访问 $$abc abc是一个宏,美元符号不是其名称的一部分 $$abc() 是一个定义在包含此引用的routine或函数中的子程序。这种语法调用子程序abc并获得其返回值 %abc InterSystems IRIS系统类中的大多数包、类和方法都以百分号开头。也有可能是InterSystems IRIS设置的一个局部变量,Routine或者嵌入SQL变量 %%abc 有关于InterSystems SQL,是伪字段的关键字 ^abc 一个函数或者一个执行程序(Roution),也可表示为全局参数 ^$abc 结构化的系统变量 ^||abc 进程私有的全局参数,是一个用于临时存储大数据值的机制 ^[XXX]%abc 对另一个名字空间中的全局或例程的引用 常用系统变量及函数: 变量/函数/类 含义 $SYSTEM 提供系统信息 $HOROLOG 当前进程的日期和时间 $zv 系统版本信息 $ZDH() 用于检验日期格式,并将可读的日期格式转换成InterSystems IRIS 数据库可读格式 $zd() 用于检验日期格式,并将InterSystems IRIS数据库日期格式转换成可读的日期格式。 示例: 字符串类型与日期类型相互转换:$ZDH/$ZD w $ZDH("2017-03-13",3) w $zd(0) $Random(range) 返回符合范围内的随机正整数 $zlog() Log指数计算 $zsqr() 平方根计算 $Case 根据第一个参数,可以返回相关的值,类似于Switch case。或者返回一个procedure或者一个routine 示例: s x =2 w $CASE(x,1:"single",2:"double",3:"triple",:"input error") 数组 本地数组:生命周期在当前进程 SET a(1) = "A local variable array" SET a(1,1,1) = "Another local variable array" 全局数组:持久化数组,直接存于磁盘 SET ^||a(1) = "A process-private global array" SET ^a(1) = "A global array"
文章
Michael Lei · 一月 25, 2022

翻译文章-数据迁移工具 - 第一部分: 从 Postgres 到 IRIS

有时需要将数据和数据模型Schema从Postgres转移或迁移到IRIS。目前有几个选择可以做到这一点,但最流行的两个选项是使用DBeaver(https://openexchange.intersystems.com/package/DBeaver)或SQLGateway。第一种方法将在本文中演示,第二种方法在Robert Cemper的一篇优秀文章中介绍,使用 SQLgateway 迁移数据库(https://community.intersystems.com/post/db-migration-using-sqlgateway),请看本文中如何使用DBeaver执行这种迁移。 为迁移过程获取样本数据 在Github上可以下载一个docker compose项目来构建和运行两个数据库。: 源数据库: 带有样本数据库的PostgreSQL 数据库 Docker 实例 . 目标数据库: 带有Schema就绪接受源数据库的InterSystems IRIS 数据平台Docker 实例. 要获得样本并运行它,请遵循以下步骤: 到 https://openexchange.intersystems.com/package/migration-pg-iris-dataset 下载并到 git repository. 克隆项目: git clone https://github.com/yurimarx/migration-pg-iris.git. 到项目目录 migration-pg-iris. 执行build: docker-compose build. 运行containers: docker-compose up -d. 实例ok后在你的Docker桌面看到: 关于要迁移的数据 要迁移的数据如下所示: 从 PostgreSQL 到 IRIS 的迁移过程将包括: 8 个表. 1,000,000 行销售数据. 250,000 行用户数据. 300 行产品. 500 行店铺. 100 行国家. 30 行城市. 5 行状态名status_name. 迁移目标为 InterSystems IRIS 中USER 命名空间namespace内的 dc_test schema . 从 PostgreSQL 到 IRIS 的开源迁移工具: DBeaver DBeaver是一个数据库工具,可以连接、创建、下拉、选择、更新和删除市场上主要数据库产品的数据对象。下载地址:https://openexchange.intersystems.com/package/DBeaver。现在按照安装说明,将这个神奇的产品安装在你的笔记本电脑或桌面。DBeaver可以用来在数据库连接之间迁移数据,即使它们来自不同的制造商和版本。 使用DBeaver连接源和目标数据库 现在我们将设置要迁移的数据库连接。在DBeaver里设置PostgreSQL连接: 1. DBeaver 到 文件 File >新建 New. 2. 选择数据库连接并点击下一步: 3. 选择SQL tab > PostgreSQL 点击下一步: 4. 如图填写PostgreSQL 连接项目 : Host: localhost Port: 5438 Database: postgres Username: postgres Password: postgres Click Finish. 在 DBeaver设置IRIS连接: 1. DBeaver 到 文件 File >新建 New.2. 选择数据库连接并点击下一步: 3. 选择 SQL tab > InterSystems IRIS 并点击下一步: 4. 如果 DBeaver 要求下载InterSystems IRIS 驱动, 点击 Yes 或 Ok.5. 如图填写InterSystems IRIS 连接项目: Host: localhost Database/Schema: user Username: _SYSTEM Password: SYS Click Text Connection and Finish. 6. postgres和用户的连接可以在数据库导航器中找到: 开始迁移 执行以下步骤:1. 打开 postgres connection > public 选择所有表。在选择的表上点击鼠标右键选择导出数据 Export Data, 如图: 2. 如图选择数据库并点击下一步 3. 点击选择按钮: 4. 选择 dc_test 并点击ok. 5. 现在有必要改变目标数据库的一些数据类型配置,因为IRIS和PostgreSQL对整数和小数值使用不同的数据类型。.6. 展开 public.country 表, 选择第一项 (country_id) 并点击 Columns… 7. 把目标类型从 int4 改成 integer 并点击Ok. 8. 对表重复以上过程 a. public.product.b. public.status_name.c. public.users.d. public.city (把city_id 和 country_id类型改成 integer ).e. public.store (把 store_id 和 city_id 类型改成 integer ).f. public.sale (把product_id, user_id 和 store_id类型改成integer,把amount改成 double ) g. public.order_status (把status_name_id 改成 integer). 9. 现在目标数据类型改好了, 点击下一步. 10. 设置获取 Fetch 大小为 1,000,000 并点击下一步. 11. 在Data load数据加载设置中接受默认值并点击下一步. 12. 在确认Confirm页面点击 Proceed. 13. 现在看到在数据库导航器看到在 InterSystems IRIS dc_test schema 下的所有 PostgreSQL表. 对于表来说,迁移过程非常简单,但对于视图、函数、触发器和存储过程,你需要使用ObjectScript或SQL重写SQL源代码。 迁移到 IRIS能得到什么? 总结一下: API 管理. 可视化报表Visual Reports (IRIS Reports). 自动化机器学习AutoML (IntegratedML). 多语言应用、数据开发环境(Python, Java, .NET, JavaScript). 服务总线ESB. BI/Analytics. 自然语言处理NLP. 微服务开发Microservices development. 多模型数据库(SQL, JSON, Analytical Cubes, Object Oriented). 数据分片Sharding. 总体来说, 迁移到 IRIS 你得到的是一个数据平台, 其他的你只有一个数据库。
公告
Claire Zheng · 七月 22

线上研讨会 | 从FHIR到OMOP,灵活的转换有效推动数据资产的应用落地

📣📣📣2025年7月25日15:00,我们邀请InterSystems销售工程师Kate Lau带来一场关于“InterSystems FHIR to OMOP数据管道”的分享,欢迎参加! 🎉🎉🎉欢迎点击此处报名参会🎉🎉🎉 医疗数据资产化对于现代化医院管理非常重要,因为它正在重塑医疗行业的价值创造逻辑,推动医疗机构从传统的“诊疗服务提供者”向“数据驱动的健康生态参与者”转型。作为数字时代的“石油”,数据资产化正在重新定义医疗行业的价值分配规则——将数据转化为可计量、可交易、可增值资产,成为数据持有方(例如:医疗机构)的必修之路。 然而在数据资产化的过程中,数据持有方(例如:医疗机构)面临四大典型困境: 数据孤岛:EHR、PACS、LIS等系统数据格式割裂,导致患者360视图缺失。 标准缺失:缺乏统一性,一方面大量数据源未采用有效标准;另一方面,行业通用模型众多、数据质量标准不一,且应用场景差异巨大。这些都阻碍了数据的有效利用。 治理耗时:数据治理依赖人工映射,导致ETL耗时过长。 价值沉没:海量数据因缺乏标准化处理,无法支持AI模型训练或科研转化。 这些典型困境的解题钥匙在互操作性和数据标准,那么便离不开FHIR和OMOP这两大标准。 FHIR(Fast Healthcare Interoperability Resources)是HL7组织开发的医疗互操作性标准,以RESTful API和JSON/XML格式为核心,以解决医疗数据交换的实时性、轻量化和跨系统协作问题,因此,FHIR目前在全球医疗健康数据资产化方面占据统治地位,FHIR可以通过标准化数据接口和持久化能力,将原始医疗数据转化为可流通、可复用的资产,为互联网医疗、健康管理、保险精算等场景提供底层支持。 OMOP(Observational Medical Outcomes Partnership)是一个由多学科研究人员组成的国际合作组织,OMOP通用数据模型(CDM)和标准化术语集,为医疗数据分析提供了统一框架和语言,医院、制药公司、数据公司,都可以从OMOP提供的标准化数据资产中获益。通过统一数据结构和术语,支持跨数据库、跨机构的大规模队列研究。OMOP的主导型场景体现在真实世界研究,如药物安全性监测、多中心临床研究、专病数据库建设等方面,通过标准化数据模型和工具链,能够降低科研门槛,加速从数据到知识的转化,成为药物研发、公共卫生政策制定的核心基础设施。 一图理解FHIR与OMOP的场景差异与协同路径 如果说FHIR是数据资产化的“起点”,通过实时交换和标准化接口,将分散的医疗数据转化为可流通的资产;那么OMOP就是科研价值的“终点”,通过标准化模型和工具链,挖掘数据资产中的知识,支撑临床决策和药物研发。从FHIR到OMOP,灵活的转换能够有效推动数据资产的应用落地。 InterSystems FHIR to OMOP数据管道提供了解决方案。通过标准互操作(基于FHIR R4标准构建数据接口)、自动化映射(内置OMOP CDM预构建映射规则,大大缩短传统ETL开发周期)、 自动化数据质量分析和云原生架构(依托AWS HealthLake实现弹性扩展),可以帮助用户快速实现数据资产的OMOP化,为用户在数字时代占据先机! 📣📣📣2025年7月25日15:00,我们邀请InterSystems销售工程师Kate Lau带来一场关于“InterSystems FHIR to OMOP数据管道”的分享,通过Demo演示,详解拆解InterSystems FHIR to OMOP解决方案。欢迎点击此处报名参会!
公告
Claire Zheng · 三月 1, 2022

InterSystems开发者Python竞赛优胜者决出暨热烈祝贺Wu Fatian 同学代表中国获得社区并列第三名好成绩!

Hi开发者们, 是时候公布 InterSystems开发者Python竞赛的优胜者了!准备好了吗! 这些开发者和他们的应用程序赢得了雷鸣般的掌声: 🏆 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名,奖金 $4,000 获奖项目 django-iris ,开发者 @Dmitry.Maslennikov 🥈 第二名,奖金 $2,000 获奖项目 appmsw-sql2xlsx ,开发者 @MikhailenkoSergey 🥉 第三名,奖金 $1,000 获奖项目 iris-python-apps ,开发者 @Muhammad.Waseem 以下为更多优胜者: 🏅 奖金$100 ,获奖项目 iris-python-dashboards ,开发者@Evgeniy.Potapov 🏅 奖金$100 ,获奖项目 GlobalToJSON-ePython-pure ,开发者 @Robert.Cemper1003 🏅 奖金$100 ,获奖项目 blockchain - [ IRIS python ] ,开发者 @davimassaru.teixeiramuta 🏅 奖金$100 ,获奖项目 AI Image Object Detector ,开发者@Yuri.Gomes 🏅 奖金$100 ,获奖项目GlobalToJSON-embeddedPython ,开发者@Robert.Cemper1003 🏅 奖金$100 ,获奖项目 IRIS-Database-and-Machine-Learning-Based-Approaches-for-Prediction-of-Spontaneous-Intracerebral-Hemo ,开发者 @Fatian.Wu 🏅 奖金$100 ,获奖项目 DIMSE Iris Dicom Fhir Service ,开发者@Ron.Sweeney1582 🏅 奖金$100 ,获奖项目 Django-Interop ,开发者 @Fernando.VianaMaia 🏅 奖金$100 ,获奖项目 IRIS Text2Audio ,开发者 @Yuri.Gomes 🏆 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名,奖金 $1,000 ,获奖项目 django-iris ,开发者 @Dmitry.Maslennikov 🥈 第二名,奖金 $625 ,获奖项目 appmsw-sql2xlsx ,开发者 @MikhailenkoSergey 🥉 第三名,奖金 $625 ,获奖项目 IRIS-Database-and-Machine-Learning-Based-Approaches-for-Prediction-of-Spontaneous-Intracerebral-Hemo ,开发者 @Fatian.Wu 恭喜所有优胜者! 感谢大家对本次比赛的关注和付出!