文章 Qiao Peng · 四月 11, 2022 7m read

6. 用户与角色

InterSystems 数据平台对用户和角色提供全面的管理和安全配置功能。加强数据平台的安全,需要加强对于用户和角色的管理。

6.1 用户管理

系统提供了一系列预置的用户账户,这些账户管理对应特殊的系统功能:

用户

说明

UnknownUser

匿名用户,通过“未验证”方式登录到系统的用户

_SYSTEM

SQL系统管理员

SuperUser

超级用户

Administrator

安装系统的用户

Admin

系统管理员

CSPSystem

Web网关管理员

IAM

IAM用户

_PUBLIC

内部使用

_Ensemble

内部使用

6.1.1 系统级用户安全配置

InterSystems数据平台有一些系统级别的用户安全配置,例如密码模式、密码有效天数、无效登录限制(多少次登录失败后要禁用用户账户)、非活动限制(多少天未登录后禁用用户账户)等。这些系统级配置通过管理门户>系统>安全管理>系统范围的安全参数:

三级等保对于用户的密码强度是有要求的。弱密码只需要0.19毫秒就能被破解,而8位强密码破解需要上百年。密码强度



0
1 745
文章 Qiao Peng · 四月 11, 2022 8m read

      数据平台不仅要安全,还要合规,三级等保是我们要符合的主要安全规范。InterSystems的数据平台和集成平台产品都和三级等保有关。如果没有正确配置它们的安全选项,就会影响到整个系统的安全,影响到合规性。

在生产环境上,如何配置安全的InterSystems的数据平台,并达到三级等保的要求?

这个系列文章,针对InterSystems 数据平台的安全架构,围绕对三级等保的合规性展开,介绍如何配置出一个安全、合规的数据平台。

注:本文提到的InterSystems的数据平台,包括Caché数据库、Ensemble集成平台HealthConnect医疗版集成平台InterSystems IRIS数据平台

三级等保的要求

三级等保要求

对数据平台的要求

身份鉴别

确保用户身份是真实、准确的

访问控制

控制:谁、以什么方式、从什么设备可以访问什么数据和功能?

入侵防范

防范静态数据、传输中的数据、日志和备份中的数据被入侵

恶意代码防范

防止恶意代码被植入和执行,例如SQL注入

可信验证

 

数据完整性

保证数据完整性和一致性的能力

数据备份恢复

0
2 762
文章 Michael Lei · 四月 10, 2022 3m read

系统实用类: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)返回相同的值。

Dumping result #1
DatabaseName    Directory       MaxSize Size    ExpansionSize   AvailableFreeDiskFreeSpace      Status  SizeInt AvailableNum    DiskFreeSpaceNum        ReadOnly
IRISSYS c:\intersystems\irishealth3\mgr\        無制限  159MB          系统默认           ト  
0
0 276
文章 姚 鑫 · 四月 10, 2022 2m read

[toc]

第108章 SQL函数 %PLUS

将数字转换为规范排序格式的排序函数。

大纲

%PLUS(expression)

%PLUS expression

参数

  • expression - 表达式,它可以是列的名称、数字或字符串字面值、算术表达式或另一个函数的结果,其中基础数据类型可以表示为任何字符类型。

描述

%PLUS将数字或数字字符串转换为规范形式,然后以数字排序顺序返回这些表达式值。

数字可以包含前导和后导零、多个前导加减号、单个小数点指示符(.)和E指数指示符。 在标准形式中,将执行所有算术运算,展开指数,将符号解析为一个前导减号或无符号,并剥离前导和后导零。

可以使用或不使用封闭字符串分隔符来指定数字字面值。 如果字符串包含非数字字符,%PLUS将在第一个非数字字符处截断数字,并以规范形式返回数字部分。 非数字字符串(任何以非数字字符开头的字符串)返回为0%PLUS也返回null0

%PLUS是一个SQL扩展,用于SQL查询查询。

可以使用 %SYSTEM.Util 类的 Collation() 方法在 ObjectScript 中执行相同的排序规则转换:

  WRITE $SYSTEM.Util.Collation("++007.500",3)

%PLUS%MVR 排序规则进行比较,后者根据字符串中的数字子字符串对字符串进行排序。

示例

0
0 133
问题 Michael Lei · 四月 7, 2022

你好!

我想知道,如果在没有运行%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 inde

2
0 258
文章 姚 鑫 · 四月 9, 2022 7m read

第107章 SQL函数 $PIECE

返回由分隔符标识的子字符串的字符串函数。

大纲

$PIECE(string-expression,delimiter[,from[,to]])

参数

  • string-expression - 要从中提取子字符串的目标字符串。 表达式,可以是字段名、字符串字面值、数字或其他函数的结果。
  • delimiter - 用于标识子字符串的分隔符。
  • from - 可选-指定要从目标字符串返回的子字符串或子字符串范围的开头的整数。 子字符串由分隔符分隔,从1开始计数。 如果省略,则返回第一个子字符串。
  • to - 可选-一个整数,指定从目标字符串返回的子字符串范围的结束子字符串。 必须与from连用。

描述

$PIECE从字符串表达式中返回指定的子字符串(PIECE)。 返回的子字符串取决于所使用的参数:

  • $PIECE(string-expression,delimiter)返回string-expression中的第一个子字符串。 如果delimiter出现在字符串表达式中,则这是在delimiter第一次出现之前的子字符串。 如果分隔符没有出现在字符串表达式中,则返回的子字符串为字符串表达式。
  • $PIECE(string-expression,delimiter,from)返回string-expression的第n个片段的子字符串,其中整数nfro
0
0 184
文章 Louis Lu · 四月 9, 2022 2m read

注意:下面内存设置数值仅限参考,具体内存数值的设置是否合适,依赖于更多实际使用情况决定。

主要需要设置下面几个内存相关配置:

(下面比例适用于服务器仅运行单实例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 调整设置大小。
    要注意对于繁忙的系统

0
0 195
文章 Louis Lu · 四月 9, 2022 2m read

此文章也是对问题 在不重建的情况下插入索引Inserting an index without reconstruction 的一种解释

在使用SQL语言对 InterSystems IRIS 中的表进行查询时,有时候会发现返回的结果与实际有出入,特别是使用count() 函数,或者select 查询时,返回的结果少于实际应返回的值。
这种情况往往是由于数据表格的索引值出了问题。

索引出问题的主要原因可能是:

  • 表中先有数据,后创建的索引定义,并且定义之后没有重新生成索引。
  • 对保存数据的global直接操作。如果是使用对象或者sql的方式操作数据,相应的索引都会自动更新,但是如果直接对global操作,则不会自动更新索引。
  • 对保存索引的global直接操作。

要解决或者要检查是不是索引引发的问题,可以使用%ValidateIndices()函数,它有两种方式使用

$SYSTEM.OBJ.ValidateIndices(classname,idxList,autoCorrect,lockOption,multiProcess)


或者

##class(classname).%ValidateIndices(idxList,autoCorrect,lockOption,multiProcess)


两种使用方法最大的差别是:$SYSTEM.OBJ.ValidateI

0
0 165
公告 Michael Lei · 四月 9, 2022

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功

0
0 274
文章 姚 鑫 · 四月 8, 2022 1m read

第106章 SQL函数 PI

返回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
0
0 107
文章 姚 鑫 · 四月 7, 2022 1m read

第105章 SQL函数 %OID

返回 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).Oid()
 
Name is
0
0 100
文章 Claire Zheng · 四月 7, 2022 6m read

众所周知,InterSystems IRIS的产品设计理念源于互操作性(Interoperable)、稳定性(Reliable)、直观(Intuitive)、可扩展性(Scalable),在云时代,InterSystems IRIS的云上操作与本地一样便捷,令用户体验有了明显提升,除此之外,为了更高效地对InterSystems IRIS进行配置,我们还提供了哪些新特性?为了便捷地进行数据迁移,InterSystems IRIS最新版本提供了哪些解决方案?

0
0 254
公告 Claire Zheng · 四月 7, 2022

4月12日,新一期“极客俱乐部”在线分享即将推出,InterSystems中国技术总监乔鹏将分享“InterSystems数据平台与三级等保”这一主题,聊聊数据平台如何保护信息安全,以及如何配置、管理数据平台,以满足三级等保要求。点击链接报名参会,或扫描下方二维码参会。

0
0 250
文章 姚 鑫 · 四月 6, 2022 2m read

第104章 SQL函数 %ODBCOUT

ODBC 格式返回表达式的格式转换函数。

大纲

%ODBCOUT(expression)

%ODBCOUT expression

参数

  • expression - 要转换的表达式。字段名称、包含字段名称的表达式或以可转换数据类型(例如 DATE%List)返回值的函数。不能是流字段。

描述

%ODBCOUT 在通过字段或数据类型的 LogicalToOdbc 方法传递值后以 ODBC 格式返回表达式。 ODBC 格式是可以通过 ODBC 呈现数据的格式。当数据暴露给 ODBC/SQL 时使用这种格式。可用的格式对应于 ODBC 定义的格式。

%ODBCOUT 通常用于 SELECT 列表选择项。它可以在 WHERE 子句中使用,但不鼓励这种使用,因为使用 %ODBCOUT 会阻止在指定字段上使用索引。

应用 %ODBCOUT 将列标题名称更改为诸如“Expression_1”之类的值;因此,通常需要指定列名别名,如下面的示例所示。

%ODBCOUT 是否转换日期取决于日期字段或函数返回的数据类型。 %ODBCOUT 转换 CURDATECURRENT_DATECURTIMECURRENT_TIME 值。它不转换 CURRENT_TIMESTAMPGETDATEGETUTCDATENOW$HOROLOG

0
0 115
文章 姚 鑫 · 四月 5, 2022 1m read

第103章 SQL函数 %ODBCIN

以逻辑格式返回表达式的格式转换函数。

大纲

%ODBCIN(expression)

%ODBCIN expression

参数

  • expression - 要转换的表达式。

描述

%ODBCIN 在通过字段或数据类型的 OdbcToLogical 方法传递值后以逻辑格式返回表达式。逻辑格式是数据的内存格式(执行操作的格式)。

%ODBCIN 是一个 SQL 扩展。

示例

以下示例显示了同一字段的默认显示格式、%ODBCIN%ODBCOUT 格式。

SELECT FavoriteColors,%ODBCIN(FavoriteColors) AS InVal,
%ODBCOUT(FavoriteColors) AS OutVal
FROM Sample.Person

以下示例在 WHERE 子句中使用 %ODBCIN

SELECT Name,DOB,%ODBCOUT(DOB) AS Birthdate
FROM Sample.Person
WHERE DOB BETWEEN %ODBCIN('2000-01-01') AND %ODBCIN('2018-01-01') 

image

0
0 120
文章 姚 鑫 · 四月 4, 2022 2m read

第102章 SQL函数 %OBJECT

标量函数,它打开一个流对象并返回相应的 oref

大纲

%OBJECT(stream)

参数

  • stream - 作为流字段名称的表达式。

描述

%OBJECT 用于打开一个流对象并返回流字段的 oref(对象引用)。

流字段上的 SELECT 返回流字段的完全形成的 oid(对象 ID)值。流字段上的 SELECT %OBJECT 返回流字段的 oref(对象引用)。这在以下示例中显示,其中 NotesPicture 都是流字段:

/// d ##class(PHA.TEST.SQLFunction).Object()
ClassMethod Object()
{
	s myquery = "SELECT TOP 3 Title,Notes,%OBJECT(Picture) AS Photo FROM Sample.Employee"
	s tStatement = ##class(%SQL.Statement).%New()
	s qStatus = tStatement.%Prepare(myquery)
	s rset = tStatement.%Execute()
	while rset.%Next() {
		w "String field: ",rset.Title,!
		w "Stream field oid: 
0
0 137
文章 姚 鑫 · 四月 3, 2022 3m read

第101章 SQL函数 NVL

测试 NULL 并返回适当表达式的函数。

大纲

NVL(check-expression,replace-expression)

参数

  • check-expression - 要计算的表达式。
  • replace-expression - 如果 check-expressionNULL,则返回的表达式。

NVL 返回与检查表达式相同的数据类型。

描述

NVL 计算检查表达式并返回以下两个值之一:

  • 如果 check-expressionNULL,则返回 replace-expression
  • 如果 check-expression 不为 NULL,则返回 check-expression

参数 check-expressionreplace-expression 可以具有任何数据类型。如果它们的数据类型不同,SQL 会将 replace-expression 转换为 check-expression 的数据类型,然后再进行比较。返回值的数据类型始终与 check-expression 的数据类型相同,除非 check-expression 为字符数据,此时返回值的数据类型为 VARCHAR2。

请注意,NVL 支持 Oracle 兼容性,并且与 ISNULL 函数相同。

日期和时间显示转换

某些检查表达式数据类型需要从逻辑模式转

0
0 130
文章 姚 鑫 · 四月 2, 2022 2m read

第100章 SQL函数 NULLIF

如果两个表达式具有相同的值,则返回 NULL 的函数。

大纲

NULLIF(expression1,expression2)

参数

  • expression1 - 表达式,可以是列名、数字或字符串文字、主变量或另一个标量函数的结果。
  • expression2 - 表达式,可以是列名、数字或字符串文字、主变量或另一个标量函数的结果。

NULLIF 返回与 expression1 相同的数据类型。

描述

如果 expression1 的值等于 expression2 的值,则 NULLIF 函数返回 NULL。否则,它返回 expression1 值。

NULLIF 等价于:

SELECT CASE 
WHEN value1 = value2 THEN NULL
ELSE value1
END
FROM MyTable

NULL 处理函数比较

下表显示了各种 SQL 比较函数。如果逻辑比较测试为 TrueAB 相同),则每个函数返回一个值,如果逻辑比较测试为 FalseAB 不同),则返回另一个值。这些函数允许执行 NULL 逻辑比较。不能在实际相等(或不相等)条件比较中指定 NULL

SQL FunctionComparisonTest Return Value
IFNULL(ex1,ex2) [two-ar
0
0 101
文章 姚 鑫 · 四月 1, 2022 4m read

第九十九章 SQL函数 NOW

返回当前本地日期和时间的日期/时间函数。

大纲

NOW()

{fn NOW}
{fn NOW()}

描述

NOW 不接受任何参数。参数括号对于 ODBC 标量语法是可选的;它们对于 SQL 标准函数语法是必需的。

NOW 以时间戳的形式返回该时区的当前本地日期和时间;它会根据本地时间变体进行调整,例如夏令时。

NOW 可以返回 %TimeStamp 数据类型格式 (yyyy-mm-dd hh:mm:ss.ffff) 或 %PosixTime 数据类型格式(编码的 64 位有符号整数)的时间戳。以下规则确定返回的时间戳格式:

  1. 如果当前时间戳提供给数据类型为 %PosixTime 的字段,则当前时间戳值以 POSIXTIME 数据类型格式返回。例如,WHERE PosixField=NOW()INSERT INTO MyTable (PosixField) VALUES (NOW())
  2. 如果当前时间戳提供给数据类型为 %TimeStamp 的字段,则当前时间戳值以 TIMESTAMP 数据类型格式 (yyyy-mm-dd hh:mm:ss) 返回。它的 ODBC 类型是 TIMESTAMPLENGTH16PRECISION19。小时以 24 小时格式表示。所有字段都保留前导零。例如,WHERE TSField=NOW()
0
0 118
文章 Claire Zheng · 四月 1, 2022 1m read

由麻省理工大学斯隆学院数字经济研究院Michael(Michael Schrage)主持,参与这次探讨的专家有人工智能布道师、数字化转型的先驱者、面临数字化转型挑战的传统公司,他们共同探讨了如何更迅速、更优质、更优价地获得切实可行的洞察,研讨涵盖了数字化转型面临的技术操作难点、投入产出性价比、数据科学家的角色、数据分析的类型、如何建设正确的基础设施和架构等等内容。面对越来越复杂的数据处理需求,这次研讨有一个观点值得借鉴:更大的数据量、种类和真实性实际上唤起了谦虚,而不是更大的信心。

0
0 282
文章 姚 鑫 · 三月 31, 2022 2m read

第九十八章 SQL函数 MONTHNAME

返回日期表达式的月份名称的日期函数。

大纲

{fn MONTHNAME(date-expression)}

参数

  • date-expression - 计算结果为 日期整数、ODBC 日期或时间戳的表达式。此表达式可以是列名、另一个标量函数的结果或日期或时间戳字面量。

描述

MONTHNAME 将日期整数、$HOROLOG$ZTIMESTAMP 值、ODBC 格式日期字符串或时间戳作为输入。

日期表达式时间戳可以是数据类型 %Library.PosixTime(编码的 64 位有符号整数),也可以是数据类型 %Library.TimeStamp (yyyy-mm-dd hh:mm:ss.fff)

时间戳的时间部分不被评估,可以省略。

MONTHNAME 返回相应日历月的名称,从一月到十二月。返回值是一个字符串,最大长度为 15。

MONTHNAME 检查提供的日期是否有效。年份必须介于 00019999(含)之间、月份 0112 以及适合该月的日期(例如,02/29 仅在闰年有效)。如果日期无效,MONTHNAME 会发出 SQLCODE -400<ILLEGAL VALUE>错误。

月份名称默认为全长美式英语月份名称。要更改这些月份名称值,请使用带有 MONTH_NAME 选项的 SET OPTION 命令。

0
0 70
文章 Lilian Huang · 三月 30, 2022 5m read

这篇文章是前面文章[首次使用InterSystems IRIS] 互操作性: 它是如何工作的?的延续。

在上一篇文章中,解释了互操作性菜单如何用于系统集成。

在本文中,我想解释如何用互操作菜单开发系统集成。

首先,您想创建什么样的业务流程? 请一边思考,一边开始以下内容。

  • Production(生产
  • 消息
  • 组件
    • 业务服务
    • 业务流程
    • 业务运营

Production被定义和用作指定系统集成所需的组件及存储组件的配置,这些配置通过管理门户界面使用(内部被存储为生产的类定义)。

例如,假设您正在创建一个业务服务,该服务定期处理放置在指定目录中的文件。在这种情况下,有必要准确配置要监测的目录和要处理的文件。一个生产就是预先准备好用于存储这些配置。

这些配置取决于发送和接收数据的组件所使用的适配器

适配器是用于简化与外部系统连接的类,有些是协议特定的,如 Mail/File/SOAP/FTP/HTTP/SQL/TCP,有些是标准特定的,如 HL7

有关适配器的更多信息,请参阅文档(protocol-specific adapters and adapters related to EDI documentation

由于我们将必要的组件定义为Production启动Production将启动系统集成,而停止Productio


0
0 302
文章 Lilian Huang · 三月 30, 2022 3m read

这篇文章的目的是为了说明如何使用互操作菜单实现系统集成。

图片左侧窗口是接受外部系统发送信息的窗口。

信息接收方式种类很多,如定时监控指定目录来读取文件,定期查询数据库,输入且等待信息输出,或直接调用其他应用程序系统传送信息。

在系统集成配置中创建IRIS 互操作性菜单,接收到存储在一个对象中的信息被称为一条消息message以下统称为消息)。消息被发送到组件component 以下统称为组件)中做后续处理。

使用所有接收到的信息或仅使用其中的一部分就能用来创建消息

假设您要将信息中包含的消息发送给外部系统。这种情况下,需要将该消息发送给负责请求外网处理的组件(图右侧)。接收到消息的组件会请求外部系统对其进行处理。

此外,假设一条消息需要人工审查、数据转换或附加数据。这种情况下,消息会被发送到图表中间的业务流程管理组件(BPM),该组件负责协调处理业务流程。

消息用于在每个组件之间发送和接收数据。当发送或接收消息时,消息会被自动存储在数据库中。

由于消息存储在数据库中,因此在数据转换前后可以检查其差异性。在操作期间,或过程中间重新开始(重新发送),可以检查作为问题根源的消息。在开发、测试和操作的每个阶段可以验证正在使用的消息状态。

一个简单的系统集成图将分为三个部分(业务服务Business Service、业务流程Business

0
0 229