清除过滤器
公告
jieliang liu · 九月 2, 2021
开发者们好!
我们很高兴地宣布推出InterSystems公司的合作伙伴名录!
这里是寻找基于InterSystems产品的商业服务 和 解决方案 的地方。
为什么选择InterSystems合作伙伴目录?
每天,我们都会收到类似这样的问题:
是否有任何基于InterSystems技术的ERP解决方案?
我住在瑞典,我怎样才能得到InterSystems的培训?
InterSystems在法国是否有任何实施伙伴?
无论我们的客户是在寻找建立解决方案的帮助,还是在寻找可信赖的咨询来源,还是在寻找实施项目的帮助,或者是寻找一些额外的培训,他们都可以通过合作伙伴名录来与适合他们的公司建立关系。
如果你的公司是InterSystems的合作伙伴,并且提供:
与InterSystems技术有关的实施、咨询或培训服务,
和使用InterSystems产品构建的解决方案。
我们欢迎你加入合作伙伴目录.
欢迎访问并与你的同事分享!
公告
Claire Zheng · 二月 23, 2022
投票时间到!
来为你最欣赏的应用投上一票吧! 【投票时间】InterSystems 开发者竞赛:Python
🔥 为你的最爱投票 🔥
如何投票?请看以下细节。
Experts nomination(专家提名)
InterSystems experts:InterSystems经验丰富的专家评审团将选出最好的应用程序,在Experts nomination(专家提名)中提名奖项。 有请InterSystems专家:
⭐️ @Benjamin.DeBoe, Product Manager⭐️ @Raj.Singh5479, Product Manager ⭐️ @Robert.Kuszewski, Product Manager⭐️ @Stefan.Wittmann, Product Manager⭐️ @Thomas.Dyar, Product Specialist⭐️ @Aleksandar.Kovacevic, Sales Engineer⭐️ @Eduard.Lebedyuk, Sales Engineer⭐️ @Sergey.Lukyanchikov, Sales Engineer⭐️ @Guillaume.Rongier7183, Sales Engineer⭐️ @Alexander.Woodhead, Technical Specialist ⭐️ @Jon.Willeke, Distinguished Quality Development Engineer⭐️ @Evgeny.Shvarov, Developer Ecosystem Manager
Community nomination(社区提名)
每一个用户来说,你投出的每一票的分数,是根据下面两类中最高的分数来计:
满足条件
奖项排名
第一名
第二名
第三名
在社区发布一篇帖子,并在Open Exchange中上传一个App
9
6
3
在社区发布了至少一篇帖子 或 在Open Exchange上传了一个App
6
4
2
在社区进行了任何有效贡献,如回帖、提问、发帖等
3
2
1
等级
奖项排名
第一名
第二名
第三名
Global Masters 的 VIP 级别 或 InterSystems 产品经理
15
10
5
Global Masters 的 Ambassador级别
12
8
4
Global Masters的Expert 级别或开发者社区版主
9
6
3
Global Masters的Specialist级别
6
4
2
Global Masters的Advocate级别,或 InterSystems员工
3
2
1
Blind vote!
每个应用获得的投票数将对所有人不可见。我们会每天在这个帖子(英文原帖)的评论区发布一次排行榜。
在 竞赛页面 ,各项目将按以下进行排名:发布得越早,排名越靠前。
P.S. 不要忘记订阅本文(请订阅英文原帖),点击铃铛图标,即可收到最新评论。
在参与投票前,您需要:
登录 Open Exchange – 使用开发者社区账号即可。
在社区内进行有效贡献 ——回答问题、发帖、在Open Exchange发布新应用等等都可以,然后你的账号才可以参与投票。点击查看本帖 ,了解如何更好地成为有效的社区贡献者!
投票期间,如果你改了主意,可以随时将票改投给其他项目。
来支持你喜欢的项目吧!
注意:在投票期间,参赛者可以继续修复bug,提升应用,所以投票者不要错过最新发布的版本哦~ 排名第一了,请同学们继续努力!
Voting for the InterSystems Python Contest goes ahead!
And here're the results at the moment:
Expert Nomination, Top 3
django-iris by @Dmitry Maslennikov
appmsw-sql2xlsx by @Sergey Mikhailenko
blockchain - [ IRIS python ] by @davi massaru teixeira muta
➡️ Voting is here.
Community Nomination, Top 3
IRIS-Database-and-Machine-Learning-Based-Approaches-for-Prediction-of-Spontaneous-Intracerebral-Hemo by @Fatian Wu
appmsw-sql2xlsx by @Sergey Mikhailenko
django-iris by @Dmitry Maslennikov
➡️ Voting is here.
公告
Claire Zheng · 四月 6, 2022
Hey 开发者们,
投票周开始了!
来为你最欣赏的应用投上一票吧!InterSystems开发者竞赛:Globals!
🔥 为你最欣赏的应用投票: 点此投票 🔥
如何投票?请看以下细节。
Experts nomination(专家提名)
InterSystems experts:InterSystems经验丰富的专家评审团将选出最好的应用程序,在Experts nomination(专家提名)中提名奖项。 有请InterSystems专家:
⭐️ @Benjamin.DeBoe, Product Manager⭐️ @Alexander.Koblov, Support Specialist⭐️ @Robert.Kuszewski, Product Manager⭐️ @Daniel.Kutac, Senior Sales Engineer⭐️ @Stefan.Wittmann, Product Manager⭐️ @Joel.Solon, Senior Technical Trainer⭐️ @Eduard.Lebedyuk, Sales Engineer⭐️ @Timothy.Leavitt, Development Manager ⭐️ @Steve.Pisani, Senior Solution Architect⭐️ @Evgeny.Shvarov, Developer Ecosystem Manager
Community nomination(社区提名)
每一个用户来说,你投出的每一票的分数,是根据下面两类中最高的分数来计:
条件
奖项排名
第一名
第二名
第三名
在社区发布一篇帖子,并在Open Exchange中上传一个App
9
6
3
在社区发布了至少一篇帖子 或 在Open Exchange上传了一个App
6
4
2
在社区进行了任何有效贡献,如回帖、提问、发帖等
3
2
1
等级
奖项排名
第一名
第二名
第三名
Global Masters 的 VIP 级别 或 InterSystems 产品经理
15
10
5
Global Masters 的 Ambassador级别
12
8
4
Global Masters的Expert 级别或开发者社区版主
9
6
3
Global Masters的Specialist级别
6
4
2
Global Masters的Advocate级别,或 InterSystems员工
3
2
1
Blind vote!
每个应用获得的投票数将对所有人不可见。我们会每天在这个帖子(英文原帖)的评论区发布一次排行榜。
在 竞赛页面 ,各项目将按以下进行排名:发布得越早,排名越靠前。
P.S. 不要忘记订阅本文(请订阅英文原帖),点击铃铛图标,即可收到最新评论。
在参与投票前,您需要:
登录 Open Exchange – 使用开发者社区账号即可。
在社区内进行有效贡献 ——回答问题、发帖、在Open Exchange发布新应用等等都可以,然后你的账号才可以参与投票。点击查看本帖 ,了解如何更好地成为有效的社区贡献者!
投票期间,如果你改了主意,可以随时将票改投给其他项目。
来支持你喜欢的项目吧!
注意:在投票期间,参赛者可以继续修复bug,提升应用,所以投票者不要错过最新发布的版本哦~
公告
Tingting Jiang · 六月 21, 2022
我们正在招聘Support Facilitator,欢迎您的自荐、推荐。
请将简历投递至Belinda.Glasson@intersystems.com,愿您的加入给我们带来新的活力,我们也将为您提供广阔的发展空间!(由于岗位职能要求,职位说明以英文形式发布。)
Location:Beijing
Job Title:Support Facilitator
Department:Product Support
Reporting to:China Support Supervisor
What We Do Matters
Why are we here? To ensure that our customers have reliable access to the right information at the right time—information they can share and use to draw insights, leading to better decisions.
Job Summary
Ensure customer satisfaction by triaging support requests, facilitating rapid responses, managing the support queue, Service Level Agreements and backlog and assisting the China Support Supervisor with the coordination of projects.
Key Responsibilities of the Role
Provide immediate response to customer support inquiries via phone or iService (the TrakCare ticketing system)
Ensure iService tickets contain sufficient information and detail for second line support to work with, according to the minimum datasets laid out
Where possible, provide immediate resolution to support inquiries. Alternatively, triage the inquiry and determine the best person to pass it to
Assist level 2 support staff and the Support Manager with the monitoring, maintenance, administration and processing of support queues and tickets
Develop and maintain a set of Standard Operating Procedures for responding to common and/or repeatable inquiries
Assist the Support Manager with adherence to Service Level Agreements
Assist the Support Manager with the coordination and management of projects to deliver new functionality to existing customers
Identify opportunities to act as a “multiplier” in order to drive efficiency
Provide regular reports to management and customers as requested
Acquire new skills by assuming additional responsibilities as requested.
Additional responsibilities as determined by management.
Experience and Qualifications
Friendly and professional verbal and written communication skills demonstrated by prior customer service experience
Good organizational skills with demonstrable attention to detail
1-2 years’ experience in a support or Project Management Office role or an administrative role in a similar organization
Must be fluent in English
Personal Specifications
IT or health-based degree or 2 years’ related experience
公告
Tingting Jiang · 六月 21, 2022
InterSystems正在招聘Market Development Representative欢迎您的自荐、推荐。请将简历投递至:Belinda.Glasson@intersystems.com,愿您的加入给我们带来新的活力,我们也将为您提供广阔的发展空间!
(由于岗位职能要求,招聘职位说明以英文形式发布。)
Location:Beijing
Job Title:Market Development Representative
Department:Marketing
Reporting to:Marketing Manager
What We Do Matters
Why are we here? To ensure that our customers have reliable access to the right information at the right time—information they can share and use to draw insights, leading to better decisions.
Job Summary
This role will suit someone who is energised by the opportunity to develop and grow enterprise software sales pipelines in Healthcare IT markets. As a Market Development Representative, you’ll be working with a smart, entrepreneurial team to shape and grow our local business. Your primary focus will be development of a high quality and growing pipeline of data platform prospects and accounts that you will nurture. You will play a pivotal role in helping the team to identify, break into, and grow named accounts. In many instances you will represent the front line of InterSystems technology engagement with significantly sized enterprise accounts and healthcare providers.
Key Responsibilities of the Role
Make first contact and nurture a prospect relationship into a marketing qualified lead
Partner with sales and marketing to develop and conduct prospecting strategies and build and execute on named account strategies
Build and execute outbound prospecting plans for targeted accounts including but not limited to emails, phone calls and industry focused event attendance
Develop brand and technology champions externally across target contacts
Follow up inbound enquiries and marketing-generated leads
Represent and promote InterSystems at industry events
Manage and be accountable for growing your pipeline using technology to engage with your prospects and to track and report on progress
Provide feedback and recommendations on marketing efforts based on real front-line interactions
Conduct industry research to uncover pain points, find potential sales opportunities, build account profiles
Handle a variety of communication including, but not limited to, inbound calls, warm follow-ups, social media, and email campaigns
Work with 3rd party outbound call partners to support the success of new campaigns and other lead generation programs if needed.
Experience and Qualifications
BA or BSc in business/economics, marketing or technical
Five or more years' experience of business development/inside sales in B2B field
Experience qualifying and selling software or other technology products over the phone
Strong listening and solution selling skills
Proven ability to collaborate with field sales representatives and marketing team to plan and achieve goals
Excellent oral and written communication skills in Chinese and English
Knowledge of standard computer application skills, such as Word, Excel, PowerPoint, and Automation/CRM.
Goal oriented and self-motivated; approaches work with a passion and enthusiasm
Experience requirement
Development and execution of a territory plan and mutually agreed strategic account plans.
Proven success and experience in leading complex enterprise sales with large implementation projects.
Demonstrable experience with tender responses and bid management.
Proven experience in managing senior client relationships.
Ability to develop relationships with customers at all levels across the business.
Able to develop and maintain internal stakeholder relationships.
Discover, qualify and develop new Data Platform business opportunities.
Define and execute market plans and campaigns – together with marketing.
Build a pipeline of new activity for Data Platform within and outside the customer base.
Maintain an in-depth understanding of the political and organisational structure of a targeted prospect.
Act as the principal liaison between InterSystems and partner/ customer accounts.
Personal Specifications
COMMUNICATION AND INFLUENCE - Is articulate and asks good questions; gives clear, concise, and focused answers to questions; explains opinions and positions; uses empathy to persuade others; keeps key people informed; ability to communicate with diverse audiences.
TEAMWORK - Ability to collaborate effectively with people of comparable talents and different strengths; handles conflict constructively; avoids being argumentative; willing to pitch in and do the mundane things that need to be done; treats people at all levels and all roles with respect.
PASSION for technology and must be technically and Social Media Savvy.
文章
Jingwei Wang · 七月 14, 2022
创建表
可以通过以下方式定义表:
通过DDL定义表
使用任意数据库管理工具执行DDL(使用ODBC,JDBC连接)
MyApp.Person表可以使用DDL CREATE TABLE语句来定义,指定SQL schema.table名称。成功执行这个SQL语句会生成一个相应的持久化类,包名MyApp,类名Person。当使用DDL命令定义一个表时,你不需要指定USEEXTENTSET或创建一个位图范围索引。InterSystems SQL会自动应用这些设置,并将它们包含在预测的持久化类中。默认情况下,CREATE TABLE在相应的类定义中指定了Final类的关键字,表示它不能有子类。
CREATE TABLE MyApp.Person (
Name VARCHAR(50) NOT NULL,
SSN VARCHAR(15) DEFAULT 'Unknown',
DateOfBirth DATE,
Sex VARCHAR(1)
)
使用Objectscript执行DDL
在ObjectScript中使用 Embedded SQL.
ClassMethod CreateTable() As %String
{
&sql(CREATE TABLE Sample.Employee (
EMPNUM INT NOT NULL,
NAMELAST CHAR (30) NOT NULL,
NAMEFIRST CHAR (30) NOT NULL,
STARTDATE TIMESTAMP,
SALARY MONEY,
ACCRUEDVACATION INT,
ACCRUEDSICKLEAVE INT,
CONSTRAINT EMPLOYEEPK PRIMARY KEY (EMPNUM)))
IF SQLCODE=0{ WRITE "Table created" RETURN "Success"}
ELSEIF SQLCODE=-201 { WRITE "Table already exists" RETURN SQLCODE}
ELSE { WRITE "Serious SQL Error, returing SQLCODE " RETURN SQLCODE_" "_%msg}
}
这个方法试图创建一个Sample.Employee表(以及相应的Sample.Employee类)。如果成功,SQLCODE变量被设置为0;如果不成功,SQLCODE包含一个SQL错误代码,表明失败的原因。 像这样的DDL命令,最常见的失败原因是: SQLCODE -99(特权侵犯)。这个错误表明你没有权限执行所需的DDL命令。一般来说,这是因为应用程序没有确定谁是当前用户。你可以使用$SYSTEM.Security.Login()方法以编程方式完成这个任务。
DO $SYSTEM.Security.Login(username,password)
使用 Dynamic SQL.
Class Sample.NewT
{
ClassMethod DefTable(user As %String, pws As %String) [Language = objectscript]
{
Do ##class(%SYSTEM.Security).Login(user,pws)
SET myddl = 2
SET myddl(1)="CREATE TABLE Sample.MyTest "
SET myddl(2)="(NAME VARCHAR(30) NOT NULL,SSN VARCHAR(15) NOT NULL)"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(.myddl)
IF qStatus '= 1 { WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT }
SET rset = tStatement.%Execute()
IF rset.%SQLCODE =0 {WRITE "Created a table"}
ELSEIF rset.%SQLCODE =-201 {WRITE "table already exists"}
ELSE {WRITE "Unexpected error SQLCODE=",rset.%SQLCODE}
}
}
批量执行DDL脚本文件
使用$SYSTEM.SQL.Schema.Run()方法从终端会话中交互式地导入InterSystems SQL DDL脚本文件
使用$SYSTEM.SQL.Schema.ImportDDL("IRIS")方法作为后台作业。这个方法可以导入和执行多个SQL命令,使你能够使用一个txt脚本文件来定义表和视图,并为它们填充数据。
针对特定供应商的%SYSTEM.SQL.Schema Load方法。特定供应商的SQL被转换为InterSystems的SQL并执行。错误和不支持的功能被记录在日志文件中。例如下面的Oracle示例。
SET $namespace = "MYNAMESPACE"
DO $SYSTEM.SQL.Schema.LoadOracle()
通过持久化类定义表 当编译时,这个持久化类会自动投射到一个与类定义相对应的关系表中:每个类代表一个表;每个属性代表一个列,以此类推。这个定义在MyApp schema中创建了MyApp.Person持久化类和相应的SQL表Person。持久类的名称Person被用作SQL表的名称。要提供一个不同的SQL表名,你可以使用SqlTableName类的关键字。
Class MyApp.Person Extends %Persistent
{
Parameter USEEXTENTSET = 1; //USEEXTENTSET 类参数被定义并设置为1,这个参数将表的存储组织成一个更有效的globals集合。
Property Name As %String(MAXLEN=50) [Required];
Property SSN As %String(MAXLEN=15) [InitialExpression = "Unknown"];
Property DateOfBirth As %Date;
Property Sex As %String(MAXLEN=1);
Index BitmapExtent [Extent, Type = bitmap ] //位图范围索引为范围集中的所有ID创建一个索引。这种设置使得计数和其他操作更加有效。
}
使用持久化类定义在编译时可以创建的相应的表,但是这个表定义不能使用SQL DDL命令进行修改或删除(或者使用管理门户的Drop操作),这些命令会给你提示"'schema.name'类不启用DDL...")。你必须在表类定义中指定[DdlAllowed]以允许这些操作。
Class MyApp.Person Extends %Persistent [DdlAllowed]
根据现有的表(或表或视图)来定义和填充一个新的表。 你指定一个查询和一个新的表名。现有的表名和/或新的表名可以是限定的或非限定的。查询可以包含JOIN语法。查询可以提供列名别名,成为新表中的列名。 可以使用:
CREATE TABLE AS SELECT命令
CREATE TABLE Sample.YoungPeople
AS SELECT Name,Age
FROM Sample.People
WHERE Age < 21
$SYSTEM.SQL.Schema.QueryToTable()方法执行。
DO $SYSTEM.SQL.Schema.QueryToTable("SELECT Name,Age,AVG(Age) AS AvgInit FROM Sample.Person WHERE Age < 21","Sample.Youth",1,.errors)
QueryToTable()复制了现有表的DDL定义,并将其指定为新表的名称。它复制查询中指定的字段的定义,包括数据类型、最大长度和最小值/最大值,但不复制字段的数据约束,如默认值、要求值或唯一值。它不会从一个字段复制引用到另一个表中。 如果查询指定SELECT *或SELECT %ID,原始表的RowID字段将被复制为数据类型为整数的非必填、非唯一的数据字段。QueryToTable()为新表生成了一个唯一的RowID字段。如果复制的RowID被命名为ID,生成的RowID被命名为ID1。
QueryToTable()为这个新表创建一个相应的持久化类。该持久化类被定义为DdlAllowed。新表的所有者是当前用户。 新表被定义为默认存储=YES和支持位图索引=YES,不管源表中的这些设置如何。为新表创建的唯一索引是IDKEY索引,没有生成位图范围索引。被复制的字段的索引定义不会被复制到新表中。
$SYSTEM.SQL.Schema.TableExists()方法可以用来确定一个表的名字是否已经存在。
RowID
在SQL中,每条记录都由一个唯一的整数值来标识,称为RowID。
在InterSystems SQL中,你不需要指定一个RowID字段。当你创建一个表并指定所需的数据字段时,会自动创建一个RowID字段。这个RowID在内部使用,但没有被映射到一个类属性。默认情况下,只有当一个持久化类被投射到一个SQL表时,它的存在才是可见的。在这个投射表中,会出现一个额外的RowID字段。
默认情况下,这个字段被命名为 "ID "并被分配到第1列,且这个字段是自增的,不会被重复使用。因此,如果记录被插入和删除,RowID值将是升序的数字序列,但可能不是数字连续的。且ALTER TABLE不能修改或删除RowID字段的定义。RowID计数器可以通过TRUNCATE TABLE命令被重置,但它不会被DELETE命令重置,即使DELETE命令删除了表中的所有记录。如果没有数据被插入到表中,或者TRUNCATE TABLE被用来删除所有表的数据,IdLocation存储关键字的global是未定义的。
默认情况下,InterSystems IRIS将这个字段命名为 "ID",然而这个字段名并不保留。RowID字段名在每次编译表的时候都会重新建立。如果用户定义了一个名为 "ID "的字段,当表被编译时,InterSystems IRIS将RowID命名为 "ID1"。例如,如果用户随后使用ALTER TABLE来定义一个名为 "ID1 "的字段,表的编译就会将RowID重命名为 "ID2",以此类推。在一个持久化的类定义中,你可以使用SqlRowIdName类关键字来直接指定这个类所投射的表的RowID字段名。由于这些原因,应该避免用名字来引用RowID字段。
InterSystems SQL提供了%ID伪列名(别名),它总是返回RowID值,不管分配给RowID的字段名是什么。(InterSystems TSQL提供了$IDENTITY伪列名,它也做同样的事情)。
默认情况下,使用CREATE TABLE定义的表使用$SEQUENCE执行ID分配,允许多个进程同时快速填充表。当$SEQUENCE被用来填充表时,一个RowID值的序列被分配给一个进程,然后按顺序分配它们。因为并发的进程使用他们自己分配的序列来分配RowID,所以不能假设由一个以上的进程插入的记录是按照插入的顺序进行的。
当使用CREATE TABLE创建一个表时,RowID默认是隐藏的。一个隐藏的字段不会被SELECT *显示,并且是PRIVATE。当你创建一个表的时候,你可以指定%PUBLICROWID关键字来使RowID不被隐藏并且是公开的。这个可选的%PUBLICROWID关键字可以在CREATE TABLE逗号分隔的表元素列表中的任何地方指定,但不能在ALTER TABLE中指定。
当创建一个投射为表的持久化类时,RowID默认不会被隐藏。它通过SELECT *显示,并且是公共的。你可以通过指定类的关键字SqlRowIdPrivate来定义一个RowID为隐藏和PRIVATE的持久化类。
作为外键引用的RowID必须是公共的。默认情况下,一个具有公共RowID的表不能被用作源表或目标表,例如使用 INSERT INTO Sample.DupTable SELECT * FROM Sample.SrcTable 将数据复制到一个重复的表。
你可以使用管理门户SQL界面来查看RowID是否被隐藏。
基于其他字段的RowID
通过定义一个投射表的持久化类,你可以将RowID定义为来自一个字段或一个字段组合的值。要做到这一点,用IdKey索引关键字指定一个索引。例如,通过PatientName字段的值指定索引定义
IdxId On PatientName [IdKey];
或者通过PatientName和SSN字段的合并值指定索引定义
IdxId On (PatientName,SSN) [IdKey]
但是,基于字段的RowID比采取系统分配的连续正整数的RowId效率低。
在INSERT中:为构成RowId的字段或字段组合指定的值必须是唯一的。指定一个非唯一的值会产生一个SQLCODE -119 "UNIQUE或PRIMARY KEY约束在INSERT时唯一性检查失败"。
在UPDATE中:默认情况下,组成RowId的每个字段的值是不可修改的。试图修改这些字段之一的值会产生一个SQLCODE -107 "不能UPDATE RowID或基于字段的RowID"。
当一个RowID基于多个字段时,RowID的值是由||操作符连接的每个组成字段的值。例如,Ross,Betsy||123-45-6789。InterSystems IRIS试图确定基于多个字段的RowID的最大长度;如果它不能确定最大长度,RowID长度默认为512。
主键
InterSystems IRIS提供两种方法来唯一地识别表中的行:RowID和主键。
可选的主键是一个有意义的值,应用程序可以用它来唯一地识别表中的一行(例如在连接中)。一个主键可以是用户指定的数据字段,也可以是一个以上的数据字段的组合。主键值必须是唯一的,但不要求是整数值。RowID是一个内部使用的整数值,用于识别表中的一行。通常情况下,主键是一个由应用程序生成的值,而RowID是一个由InterSystems IRIS生成的唯一整数值。
系统会自动创建一个master map来访问使用RowID字段的数据行。如果你定义了一个主键字段,系统会自动创建并维护一个主键索引。
显然,有两个不同的字段和索引来识别行,这种双重性不一定是好事。你可以通过以下两种方式中的任何一种解决单一的行标识符和索引:
使用应用程序生成的主键值作为IDKEY。你可以通过在类定义中使用关键字PrimaryKey和IdKey来识别主键索引,当然,也可以从DDL中这样做。这使得主键索引成为表的主映射。因此,主键将被用作行的主要内部地址。如果主键由一个以上的字段组成,或者主键值不是整数,这可能会降低效率。
不要使用应用程序生成的主键值,而是使用应用程序内系统生成的RowID整数作为应用程序使用的主键(例如在连接中)。这样做的好处是,整数的RowID适合于更有效的处理,包括使用位图索引。
根据应用程序的性质,你可能希望解决一个单一的行标识符和索引,或者为应用程序生成的主键和系统生成的RowID设置单独的索引。
特殊字段:RowVersion字段 , 自增字段, 和 Serial 计数器字段
InterSystems SQL支持三种特殊用途的数据类型,用于自动递增计数器的值。这三种数据类型都是扩展%Library.BigInt数据类型类的子类。
%Library.RowVersion: 计算对所有RowVersion表的插入和更新的命名空间。只有包含ROWVERSION字段的表的插入和更新才会增加这个计数器。ROWVERSION值是唯一的,不可修改的。这个全命名空间的计数器从不重置。可以通过指定一个数据类型为ROWVERSION(%Library.RowVersion)的字段来创建一个RowVersion字段。你只能在每个表中指定一个ROWVERSION数据类型字段。试图创建一个有一个以上ROWVERSION字段的表会导致5320编译错误。RowVersion字段不应该被包含在唯一键或主键中。RowVersion字段不能成为IDKey索引的一部分。
%Library.Counter(也被称为SERIAL计数器字段)。计算插入到表中的次数。默认情况下,这个字段接收一个自动递增的整数。然而,用户可以为这个字段指定一个非零的整数值。用户可以指定一个重复的值。如果用户提供的值大于系统提供的最高值,自动递增计数器被设置为从用户指定的值开始递增。这个计数器通过TRUNCATE TABLE命令被重置为1。它不会被DELETE命令重置,即使DELETE命令删除了表中的所有记录。分片的表不能有SERIAL计数器字段。
%Library.AutoIncrement: 计算插入到表中的次数。默认情况下,这个字段接收一个自动递增的整数。然而,用户可以为这个字段指定一个非零的整数值。用户可以指定一个重复的值。指定一个用户值对自动递增计数器没有影响。
所有这三个字段和IDENTITY字段都返回AUTO_INCREMENT = YES,如下面的例子所示。
查看表定义
表信息 INFORMATION.SCHEMA.TABLES持久化类显示当前命名空间中所有表(和视图)的信息。包括模式和表名,表的所有者,以及是否可以插入新记录。TABLETYPE属性表明它是一个基础表还是一个视图。
SELECT Table_Type,Table_Schema,Table_Name,Owner FROM INFORMATION_SCHEMA.TABLES
INFORMATION.SCHEMA.CONSTRAINTTABLEUSAGE持久化类为当前命名空间中的每个表定义的每个主键(显性或隐性)、外键或唯一约束。 INFORMATION.SCHEMA.KEYCOLUMNUSAGE为当前命名空间中的每个表的每个已定义的约束。 也可以使用管理门户SQL界面中的目录详情来查看表信息。
列信息
GetColumn 方法
SET stat = ##class(%SYSTEM.SQL.Schema).GetAllColumns("MyApp.Person",.byname,.bynum)
IF stat=1
{
SET i=1
WHILE $DATA(bynum(i))
{
WRITE "name is ",bynum(i), "column is ", i, !
}
}ELSE{ WRITE "GetAllColumns() cannot locate specified table"}
生成结果:
name is ID col num is 1
name is Age col num is 2
name is Home col num is 3
name is Name col num is 4
SQL脚本 INFORMATION_SCHEMA.COLUMNS可以列出指定schema的所有列名:
SELECT TABLE_NAME,COLUMN_NAME,ORDINAL_POSITION,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,COLUMN_DEFAULT,IS_NULLABLE,UNIQUE_COLUMN,PRIMARY_KEY
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='MyApp'
或者
SELECT TOP 0 * FROM tablename.
Constraints信息
INFORMATION.SCHEMA.TABLECONSTRAINTS持久化类列出了表名,约束类型和约束名称。约束类型包括UNIQUE, PRIMARY KEY, 和 FOREIGN KEY。
SELECT Table_Schema,Table_Name,Constraint_Type,Constraint_Name FROMINFORMATION_SCHEMA.TABLE_CONSTRAINTS
INFORMATION.SCHEMA.CONSTRAINTCOLUMNUSAGE持久化类列出了表名、列名和约束名称。如果一个约束涉及到多个列,那么每一个列都会列出一个单独的项目。
SELECT Table_Schema,Table_Name,Column_Name,Constraint_Name FROMINFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
INFORMATION.SCHEMA. REFERENTIALCONSTRAINTS持久化类列出了外键约束,包括引用表(CONSTRAINT_SCHEMA, CONSTRAINT_TABLE_NAME),被引用表(UNIQUE_CONSTRAINT_SCHEMA, UNIQUE_CONSTRAINT_TABLE),外键名称(CONSTRAINT_NAME),以及UPDATE和DELETE参考动作(UPDATE_RULE,DELETE_RULE),值为NO ACTION,SET DEFAULT,SET NULL,或CASCADE。
SELECT Constraint_Table_Name,Unique_Constraint_Table,Constraint_Name,Update_Rule,Delete_Rule FROMINFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
连接外部表
在InterSystems SQL中,你也可以有 "外部表",即在SQL字典中定义的表,但存储在一个外部关系数据库中。外部表的作用就像它们是本地的InterSystems IRIS表一样:你可以对它们发出查询,执行INSERT、UPDATE和DELETE操作。
对外部数据库的访问是由InterSystems SQL Gateway提供的,它使用ODBC或JDBC提供透明的连接。
公告
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功能的检查。 在命令行中,在docker run或docker start命令中的镜像后面添加--check-caps false。 例如:
docker run containers.intersystems.com/intersystems/iris-community:2022.1.0.152.0 --check-caps false
如果你使用的是docker-compose,相应的改动如下:
command: --check-caps false
能力检查是在启动IRIS进程之前检查常见的错误配置的一种方式。 禁用Linux能力检查对容器中运行的IRIS进程没有影响。
更多阅读
Docker 20.10.14 release notes
Running InterSystems Products in Containers
公告
jieliang liu · 五月 15, 2022
嗨,开发者们!
看看你如何用PyODBC和Native API在Python中开发并连接到InterSystems IRIS®数据平台。
⏯ Using Python to Connect to InterSystems IRIS
欢迎大家来我们的 Bilibili主页观看更多视频!
文章
Jingwei Wang · 七月 21, 2022
视图为存储查询,提供了物理表的所有灵活性和安全权限。所有的视图都是可更新的或只读的。
注意:不能对只读的数据库中的数据创建视图。不能对存储在通过ODBC或JDBC网关连接的Informix表中的数据创建视图。这是因为InterSystems IRIS查询转换在FROM子句中使用子查询,而Informix不支持FROM子句的子查询。
创建视图
视图名称可以是合格的的或不合格的。一个没有限定的视图名称是一个简单的标识符。MyView。一个合格的视图名称由两个简单的标识符组成,一个schema名称和一个视图名称,用句号隔开, 例如MySchema.MyView。视图名和表名遵循相同的命名规则,并对未限定的名称执行相同的schema名称解析。同一模式中的视图和表不能有相同的名称。
你可以通过几种方式定义视图:
使用SQL CREATE VIEW命令(在DDL脚本中或通过JDBC或ODBC)。
CREATE VIEW MySchema.MyView (ViewCol1, ViewCol2, ViewCol3) AS
SELECT TableCol1, TableCol2, TableCol3
FROM MyTable
使用管理门户的创建视图界面。 系统操作 -> SQL -> 操作 -> 创建视图
这将显示 "创建视图 "窗口,如图所示: schema:您可以决定将视图包含在现有schema中,或者创建一个新的schema。 视图名称:一个有效的视图名称。在同一模式中,你不能对表和视图使用相同的名称。 带检查选项:选项有READONLY、LOCAL、CASCADED。 授予视图的所有权限给_PUBLIC:如果选择了这个选项,这个选项会给所有用户执行这个视图的权限。默认是不给所有用户访问该视图的权限。 查看文本:你可以通过以下三种方式中的任何一种指定视图文本。 在 "查看文本 "区域键入一个SELECT语句。 使用查询生成器创建一个SELECT语句,然后按确定将此查询提供给视图文本区。 如果你在管理门户SQL界面左侧选择一个缓存查询名称(例如%sqlcq.USER.cls4),然后调用创建视图,这个缓存查询就会提供给视图文本区。注意,在视图文本区,你必须在保存视图文本之前用实际值替换变量引用(问号)。
使用Objectscript执行DDL
ClassMethod CreateTable() As %String
{
&sql(CREATE VIEW Sample.VSrStaff
AS SELECT Name AS Vname,Age AS Vage
FROM Sample.Person WHERE Age>75)
IF SQLCODE=0{ WRITE "Created a view"}
ELSEIF SQLCODE=-201 { WRITE "View already exists" RETURN SQLCODE}
ELSE { WRITE "Serious SQL Error, returing SQLCODE " RETURN SQLCODE_" "_%msg}
}
$SYSTEM.SQL.Schema.ViewExists()方法可以用来确定一个视图名称是否已经存在。
查看视图定义
视图信息
SELECT * FROM INFORMATION_SCHEMA.VIEWS
视图的依赖表 NFORMATION.SCHEMA.VIEWTABLEUSAGE持久化类显示当前命名空间中的所有视图和它们所依赖的表。
通过SQL脚本显示视图依赖表
SELECT View_Schema,View_Name, Table_Schema,Table_Name FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
通过ObjectScript显示依赖表
SET statemt = ##class(%SQL.Statement).%New()
SET cqStatus = statemt.%PrepareClassQuery("%Library.SQLCatalog","SQLViewDependsOn")
IF cgStatus '= 1 { WRITE "PrepareClassQuery failed:" DO $System.Status.DisplayError(cgStatus) QUIT }
SET rset = statemt.%Execute("vschema.vname")
DO rset.%Display()
如果调用者没有视图所依赖的表的权限,该表及其模式将被列为NOT PRIVILEGED。这允许没有表权限的调用者确定视图所依赖的表的数量,但不能确定表的名称。
View ID: %VID
InterSystems IRIS为视图或FROM子句返回的每条记录分配一个整数的视图ID(%VID)。与表的行ID号一样,这些视图的行ID号也是系统分配的、唯一的、非空的、非零的和不可修改的。这个%VID通常对用户来说是不可见的,只有在明确指定时才会返回。它作为数据类型INTEGER返回。因为%VID值是连续的整数,如果视图返回有序的数据,它们就更有意义;视图只有在与TOP子句配对时才能使用ORDER BY子句。
CREATE VIEW Sample.VSrStaff
AS SELECT TOP ALL Name AS Vname,Age AS Vage
FROM Sample.Person WHERE Age>75
ORDER BY Name
下面的例子返回VSrStaff视图定义的所有数据(使用SELECT *),并且还指定要返回每一行的视图ID。与表的行ID不同,视图的行ID在使用星号语法时不会显示;只有在SELECT中明确指定时才会显示。
SELECT *,%VID AS ViewID FROM Sample.VSrStaff
%VID可以用来进一步限制SELECT从视图返回的行数,如下面的例子所示。
SELECT *,%VID AS ViewID FROM Sample.VSrStaff WHERE %VID BETWEEN 5 AND 10
因此,%VID可以用来代替TOP(或者作为TOP的补充)来限制查询返回的记录的数量。一般来说,TOP子句用于返回数据记录的一个小子集;%VID用于返回大部分或全部数据记录,将记录返回到小子集的中。这个功能可能很有用,特别是对于Oracle查询(%VID很容易映射到Oracle ROWNUM)。然而,用户应该意识到,与TOP相比,使用%VID有一些性能限制。
%VID不执行time-to-first-row的优化。TOP的优化是尽可能快地返回第一行数据。%VID的优化是为了尽可能快地返回完整的数据集。
如果查询指定了排序的结果,%VID不会执行有限的排序(这是由TOP执行的特殊优化)。查询首先对完整的数据集进行排序,然后使用%VID对返回的数据集进行限制。TOP是在排序前应用的,所以SELECT执行的是有限的排序,只涉及一个受限制的行子集。
为了保持对第一行的优化时间和有限的排序优化,你可以使用一个带有TOP和%VID组合的FROM子句子查询。
SELECT *,%VID AS SubQueryID
FROM (SELECT TOP 10 Name,Age
FROM Sample.Person
WHERE Age > 75
ORDER BY Name)
WHERE %VID > 4
不能对指定了%VID的查询进行并行执行,即使明确指定了%PARALLEL关键字。
文章
Nicky Zhu · 一月 8, 2021
在本文中,我们将讨论孤立消息。
## 什么是孤立消息
每个消息正文都与一个保存元数据的消息标头相关联。 标头保存源配置名称、目标配置名称、创建时间、处理时间、关联的消息正文引用、会话信息、消息正文类名、消息状态等信息。 当有消息正文记录没有相应的标头记录时,这些消息正文称为孤立消息正文。 我们将讨论可能导致孤立消息正文产生的原因。
### 仅清除标头
在清除任务设置中,**BodiesToo** 设置用于指定是否将消息正文与消息标头一起清除。 如果**关闭**此设置,清除任务将只删除消息标头,而保留消息正文。 这些消息正文将成为孤立记录,因为所引用的标头已被删除。 如果清除消息标头但保留消息正文,则管理门户将无法清除孤立消息正文。 在这种情况下,必须以编程方式清除消息正文。

请参阅有关清除任务的文档
[http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=EGMG\_purge#EGMG\_purge_basic](http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=EGMG_purge#EGMG_purge_basic)
### 复杂的消息正文类(对象值属性)
当 Ensemble 清除某条消息正文时,不一定删除该消息正文的对象值属性。 具体来说,只有当其他对象是序列对象或子对象(由关系定义)时,才会删除这些对象。 对于其他对象,必须通过在消息正文类中定义删除触发器或实现 **%OnDelete()** 方法来适当地处理删除。
OnDelete 实现的示例代码
Class Sample.Address Extends %Persistent{
/// The street address.
Property Street As %String(MAXLEN = 80);
/// The city name.
Property City As %String(MAXLEN = 80);
/// The 2-letter state abbreviation.
Property State As %String(MAXLEN = 2);
/// The 5-digit U.S. Zone Improvement Plan (ZIP) code.
Property Zip As %String(MAXLEN = 5);
}
Class Sample.Person Extends %Persistent{
/// Person's name.
Property Name As %String [ Required ];
/// Person's Social Security number. This is validated using pattern match.
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
/// Person's Date of Birth.
Property DOB As %Date;
/// Person's home address.
Property Home As Address;
/// Person's office address.
Property Office As Address;
///Callback for object deletion
ClassMethod %OnDelete(oid As %ObjectIdentity) As %Status [ Private ]{
// Delete the property object references.
Set tSC = $$$OK, tThis = ##class(Sample.Person).%Open(oid)
If $ISOBJECT(tThis.Home) Set tSC = ##class(Sample.Address).%DeleteId(tThis.Home.%Id())
If $ISOBJECT(tThis.Office) Set tSC = ##class(Sample.Address).%DeleteId(tThis.Office.%Id())
Quit tSC
}
///Callback/Trigger for SQL delete
Trigger OnDelete [ Event = DELETE ]{
// Delete the property object references. {%%ID} holds the id of the record being deleted.
Set tID={%%ID}
Set tThis = ##class(Sample.Person).%OpenId(tID)
If $ISOBJECT(tThis.Home) Do ##class(Sample.Address).%DeleteId(tThis.Home.%Id())
If $ISOBJECT(tThis.Office) Do ##class(Sample.Address).%DeleteId(tThis.Office.%Id())
Quit
}
}
### 已创建但从未发送到其他主机的消息对象
当一条消息被发送/转发到其他主机时,Ensemble 会创建一个新的消息标头,并关联相应的消息正文。 如果在业务服务/流程中创建的消息正文/对象实例已保存到磁盘/数据库,但从未在生产过程中发送到其他主机,它将没有关联的标头,并保留为孤立消息正文。 最佳实践是不创建消息正文,除非它将被转发,或者不对该对象实例调用 %Save()(在将消息放入目标配置队列之前,SendRequestSync/SendRequestAsync API 将保存该对象实例)。 这样,除非将消息正文对象发送到其他主机,否则它将不会持久化。
此问题的最常见原因是开发人员:
克隆了消息正文,且从未转发克隆的消息正文
在上下文变量 (BPL) 中创建了消息正文对象,且从未转发。
## 孤立消息的影响
孤立消息不会被清除任务清除。 这些消息将占用磁盘空间,并且随着它们数量的增长,磁盘使用量也会成比例增加。 不仅消息正文数据使用磁盘空间,每条孤立消息正文记录的任何索引/搜索表条目也都占用磁盘空间。
## 识别孤立消息
可以通过查询消息标头和正文来确定孤立消息是否存在。 每个消息标头都引用相应的消息正文。 消息正文对象 Id 引用存储在标头的 MessageBodyId 属性中,消息正文类名存储在标头的 MessageBodyClassName 属性中。
在 HL7 消息表中查找孤立消息的示例查询:
SELECT HL7.Id FROM EnsLib_HL7.Message HL7
LEFT JOIN Ens.MessageHeader hdr
ON HL7.Id=hdr.MessageBodyId
WHERE hdr.MessageBodyId IS NULL
上面的查询将返回所有没有相应标头的 HL7 消息。 可以将该查询修改为查询任何其他消息类型,只需替换消息正文表名即可。
## 清除孤立消息
管理门户无法提供清除孤立消息正文的方法。 在这种情况下,必须以编程方式清除消息正文。 在 **ENSDEMO** 数据库中,类 **Demo.Util.CleanupSet** 提供了一个如何执行此操作的示例。 该例程也执行深度清除,同时处理对象属性引用。
还可以参考另一个例程来清除孤立消息,但该例程不执行深度清除,只对删除消息正文有帮助。 我在下面附上可下载源码的 github 链接:
最佳做法是始终:
1. 避免编程错误(如前面所讨论)以防止出现孤立消息
2. 只有需要正文并且知道只能以编程方式清除这些消息正文时,才将清除任务设置成关闭 BodiesToo 设置。
3. 实施关系或针对持久对象属性实现 OnDelete。
我希望本文对您构建生产环境有所帮助。 如果您有任何问题或疑虑,请联系我们。 谢谢。
文章
Nicky Zhu · 一月 10, 2021
当您首次使用InterSystems IRIS时,通常只需安装最低安全级别的系统。您输入密码的次数会比较少,这样有利于快速了解和操作开发服务和Web应用程序。而且,最低的安全性有时更便于部署开发项目或解决方案。
然而,有时需要将项目移出开发环境,迁移到一个可能很不友好的互联网环境中。在部署到生产环境之前,需要使用最大的安全设置(即,完全锁定)对其进行测试。这就是我们在本文中将要讨论的内容。
如果想更全面地了解InterSystems Caché、Ensemble和IRIS中的DBMS安全性问题,请阅读我的另一篇文章《[在生产环境中安装InterSystems Caché DBMS的相关建议](https://community.intersystems.com/post/recommendations-installing-intersystems-cach%C3%A9-dbms-production-environment)》。
InterSystems IRIS中安全系统的设计概念是针对不同的类别(用户、角色、服务、资源、特权和应用程序)应用不同的安全设置。

可以为用户分配角色。用户和角色可以对资源(数据库、服务和应用程序)拥有不同的读、写和使用权限。用户和角色还可以对数据库中的SQL表拥有SQL权限。
# 安全级别的差异
用户在安装InterSystems IRIS时,可以为其选择安全级别:最小、正常或锁定。这些级别在用户参与程度、可用角色和服务,以及服务和应用程序的身份验证方法的配置方面存在差异。如需了解更多信息,请阅读《InterSystems IRIS安装准备》指南中的《InterSystems安全性准备》章节。
在文档中,您可以找到下面这些表格,其中显示了每个级别的安全设置。这些安全设置可以在系统管理门户界面进行更改。
## 初始用户安全设置
|Security Setting | Minimal | Normal | Locked Down |
|--------------------------------------------|--------------|--------------|----------------------|
|Password Pattern |3.32ANP |3.32ANP |8.32ANP |
|Inactive Limit |0 |90 days |90 days |
|Enable _SYSTEM User |Yes |Yes |No |
|Roles assigned to UnknownUser |%All |None |None |
## 初始服务属性设置
|Service Property |Minimal|Normal|Locked Down|
|-----------------------------------|-----------|----------|------------------|
|Use Permission is Public |Yes |Yes |No |
|Requires Authentication |No |Yes |Yes |
|Enabled Services |Most |Some |Fewest |
## 初始服务启用设置
|Service | Minimal | Normal | Locked Down |
|-----------------------------------|--------------|-------------|---------------------|
|%Service_Bindings | Enabled | Enabled | Disabled |
|*%Service_CSP | Enabled | Enabled | Enabled |
|%Service_CacheDirect | Enabled | Disabled | Disabled |
|%Service_CallIn | Enabled | Disabled | Disabled |
|%Service_ComPort | Disabled | Disabled | Disabled |
|%Service_Console | Enabled | Enabled | Enabled |
|%Service_ECP | Disabled | Disabled | Disabled |
|%Service_MSMActivate | Disabled | Disabled | Disabled |
|%Service_Monitor | Disabled | Disabled | Disabled |
|%Service_Shadow | Disabled | Disabled | Disabled |
|%Service_Telnet | Disabled | Disabled | Disabled |
|%Service_Terminal | Enabled | Enabled | Enabled |
|%Service_WebLink | Disabled | Disabled | Disabled |
*InterSystems IRIS环境下,%Service_CSP应用%Service_WebGateway。
不同的操作系统所使用的服务略有不同。
# 如何提高安全性
您需要为每个启用的服务选择合适的身份验证方法,包括:无认证(unauthenticated)、密码、Kerberos或授权。
您还需要禁用系统中未使用的web应用程序。对已启用的web应用程序选择正确的身份验证方法:认证、密码、Kerberos、授权、登录或cookie。
当然,管理员可以为每一个项目和解决方案选择安全设置,以满足客户的项目要求。整个过程应始终保持一种平衡,即,一方面要保证系统足够方便以支持用户完成实际工作,另一方面又要保证系统足够安全能够阻止入侵者。不过众所周知,被禁用的系统才是最安全的系统。
如果遇到需要多次手动提高系统安全级别的情况,这就是一个明确的迹象,表明需要编写一个软件模块来解决这些问题。
实际上,InterSystems Open Exchange提供了一个锁定(LockDown)程序,可以帮助您提高安全性。该程序的源代码可以在InterSystems isc-apptools-lockdown页面的存储库中找到。
LockDown程序有以下几种作用:
## 首先,更改以下预安装用户的密码:
- Admin,
- CSPSystem,
- IAM,
- SuperUser,
- UnknownUser,
- _Ensemble,
- _SYSTEM.
## 其次,禁用除以下服务之外的所有服务:
- %%service_web gateway
- %service_console
- %service_login
- %service_terminal
## 再次,为所有web应用程序设置密码保护,包括:
- /csp/ensdemo
- /csp/samples
- /csp/user
- /isc/studio/usertemplates
- /csp/docbook
- /csp/documatic
- /isc/studio/rules
- /isc/studio/templates
## 最后,设置系统范围内的安全参数,包括:
- 密码复杂度为 "8.32 ANP"
- 限制90天内不活跃的用户
- 开启审计和其他所有安全相关的事件
您可以从GitHub下载LockDown.cls,在系统上安装好LockDown程序。然后在终端输入以下内容:
```
USER>zn “%SYS”
%SYS>do $system.OBJ.Load("/home/irisusr/LockDown.cls","ck")
```
或者可以使用以下命令从公共注册中心通过ZPM批处理管理器进行安装:
```
USER>zn “%SYS”
%SYS> zpm “install isc-apptools-lockdown”
```
# 执行LockDown程序
强烈建议在执行LockDown程序之前先进行备份。
必须从%SYS命名空间执行LockDown程序。如果您不想更改所有预安装用户的密码,请将第一个参数保留为空。
如果希望保留使用IRIS Studio、Atelier或VSCode编辑程序和类的能力,请不要禁用%Service_Bindings服务,只需将bindings参数设置为1即可。下面是一个示例:
`do ##class(App.Security.LockDown).Apply("New Password 123",.msg,1)`
此模块还包含一个功能,该功能在系统密码被盗用、需要替换所有预装帐户但无需执行锁定的情况下很有用。可以参考下面的运行:
`do ##class(App.Security.LockDown).Change Password("New Password 123", "Admin,CSPSystem,IAM,SuperUser,Unknown User, _Ensemble,_SYSTEM")`
在执行锁定之后,应用程序或项目极有可能会停止工作。为了解决这个问题,需要将一些安全设置恢复到原始状态。这个操作可以通过管理门户界面(安全性部分)实现或以编程方式完成。
# 锁定后更改安全设置
锁定之后,如果您的web应用程序使用了密码以外的身份验证方法,就需要进行启用。
建议运行软件模块zpm-registry-test-deployment,它有一个在ZPM-registry项目中使用LockDown的示例。
在IRIS上以最低的安全级别安装该项目,安装结束时将开始运行其中的代码。代码可以用来:
- 更改所有预安装用户的密码。
- 禁用此项目中未使用的所有服务。
- 为系统上的所有应用程序启用密码保护,但Web应用程序/注册表(允许未经授权的用户获取注册表中的软件包列表)除外。
- 创建一个拥有在注册表中发布新包特权的新用户。该用户必须对IRISAPP数据库中的项目表具有写权限。
创建一个新用户:
```
set tSC= ##class(App.Security.LockDown).CreateUser(pUsername, "%DB_"_Namespace, pPassword, "ZMP registry user",Namespace)
If $$$ISERR(tSC) quit tSC
write !,"Create user "_pUsername
```
为新的未授权用户添加权限:
```
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package", "s", "UnknownUser")
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package_dependencies", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM_Analytics.Event", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "9,ZPM.Package_Extent", "e", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "9,ZPM_Analytics.Event_Extent", "e", pUsername)
If $$$ISERR(tSC) quit tSC
write !,"Add privileges "
```
运行LockDown项目:
```
set tSC= ##class(App.Security.LockDown).Apply(NewPassSys)
If $$$ISERR(tSC) quit tSC
Change the settings for the web app so that an unknown user can log in:
set prop("AutheEnabled")=96
set tSC=##class(Security.Applications).Modify("/registry",.prop)
If $$$ISERR(tSC) quit tSC
write !,"Modify /registry "
Change the settings for the %service_terminal service, changing the authorization method to Operating System, Password:
set name="%service_terminal"
set prop("Enabled")=1
set prop("AutheEnabled")=48 ; Operating System,Password
set tSC=##class(Security.Services).Modify(name,.prop)
If $$$ISERR(tSC) quit tSC
write !,"Modify service terminal"
```
# 总结
在本文中,我讨论了为何要提高系统安全性级别的原因,并且通过一个InterSystems LockDown程序运行示例,演示了如何通过编程的方式提升安全性。
在本文所介绍的方法中,我们首先关闭了系统中的所有内容(即,设置最大安全级别)。然后通过开放项目运行所需的服务和应用程序(但仅限于这些)来控制安全性。我相信还有许多其他的方法和最佳实践,欢迎大家在文章评论区留言告诉我们。
公告
Claire Zheng · 二月 1, 2021
大家好!
InterSystems IRIS开发者们,我们有一个好消息要跟大家分享! 我们很高兴能够邀请大家参加我们今年的年度大奖赛,利用InterSystems IRIS数据平台创建开源解决方案!
🏆 InterSystems编程大奖赛 🏆
时间: 2021年2月8日 - 3月8日
奖金总额: $16,000
奖项设置
这次我们提升了现金奖励力度! 请看:
1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出:
🥇 第一名 - $6,000
🥈 第二名 - $3,000
🥉 第三名 - $2,000
2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用:
🥇 第一名 - $3,000
🥈 第二名 - $1,500
🥉 第三名 - $500
如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金
谁可以参加?
任何开发者社区的成员均可参加,InterSystems内部员工除外。还没有账号?现在来建一个!
参赛时间安排
根据大家的反馈意见,我们做出了调整! 我们为开发留出了更多时间!所以:
🛠 2月8日- 28日: 应用程序开发和注册阶段(在此期间,您可以持续编辑自己的项目)
✅ 3月1日-7日: 投票阶段
🎉 3月8日: 宣布优胜者!
主题
💡 InterSystems IRIS 应用程序 💡
提交使用InterSystems IRIS作为后端(API或数据库)的应用程序,使用任何类型的InterSystems IRIS API或数据模型均可。
我们欢迎您进一步改进您去年在InterSystems系列竞赛中提出的申请,并将其提交参加大奖赛。当然,也欢迎您提交一份全新的申请。
应用程序应该可以在 IRIS Community Edition 或 IRIS for Health Community Edition 或 IRIS Advanced Analytics Community Edition 上运行。
应用程序应该开源并在GitHub上发布。
资源助力
示例程序:
objectscript-docker-template
rest-api-contest-template
native-api-contest-template
integratedml-demo-template
PythonGateway-template
iris-fhir-template
iris-fullstack-template
iris-interoperability-template
iris-analytics-template
如何把您的APP提交给大赛:
如何在 InterSystems Open Exchange 上发布应用程序
如何把参赛APP提交给大赛
公平公正
点击查看 投票规则.
万分期待你的精彩项目!
加入大奖赛吧!
❗️ 点击此处,查看 官方竞赛术语解读. ❗️
顶一下 IRIS 在线培训:https://learning.intersystems.com/
在线实验室Lab:https://learning.intersystems.com/course/view.php?id=929 恭喜发财,大家踊跃报名啊! 这次我们提升了现金奖励力度,欢迎大家积极报名! 投票通道开启,欢迎参赛选手踊跃拉票啊。
https://openexchange.intersystems.com/contest/current
@jingqi.liu @Weiwei.Yang @deming.xu @Botai.Zhang very good 非常棒,都是很好的应用,我会投票的。 积极投票 踊跃投票! 这些应用都是很好的解决方案! 现在这个很火爆,可惜我不会,我也要学习编程了 可以看到这么多优秀的应用,很棒👍
公告
Claire Zheng · 二月 19, 2021
大家好!
以下是 InterSystems编程大奖赛 的技术奖励,这些奖励会让您在投票中获得加分。
Groups
奖励
得分
常规
Docker
2
ZPM
2
Unit Testing
2
API and languages
REST API
2
ODBC/JDBC
2
使用嵌入式Python
4
Native API in Java, Python, .NET, node.js
3
多模型
Globals (key-value)
2
SQL
2
Object
2
New model
3
Analytics
IRIS BI
2
IRIS NLP
2
InterSystems Reports
3
AI/ML
Integrated ML
4
Python or Julia网关
3
互操作性
使用业务流程 BPL 或业务规则
3
使用自定义互操作性适配器
2
使用产品扩展 (PEX)
4
使用工作流程引擎
2
FHIR
使用 FHIR Server REST API
3
使用 FHIR SQL 架构
2
医疗保健标准转换
3
总计
58
以下是有关所有技术奖励的详细信息和有用链接。
常规奖励
ZPM包部署- 2分
如果您为您的全栈应用程序构建并发布 ZPM(ObjectScript 包管理器)包,以便在安装了 ZPM 客户端的 IRIS 上使用命令:
zpm "install your-multi-model-solution"
进行部署,则您可以获得该奖励。
ZPM 客户端.
Documentation.
使用Docker容器- 2分
如果应用程序使用在 docker 容器中运行的 InterSystems IRIS,它将获得“Docker容器”奖励。
Unit Testing - 2分
对 InterSystems IRIS 代码进行单元测试的应用程序将获得该奖励。
请在 Documentation 和 Developer Community. 了解有关 ObjectScript 单元测试的更多信息。
InterSystems IRIS API
使用InterSystems IRIS REST API- 2 分
如果您在您的全栈应用程序中通过 REST API 访问 InterSystems IRIS,您将获得该奖励。 您可以自己构建 REST API,也可以使用任何内置 REST API 或通过 ZPM 安装。 Learn more on InterSystems REST API.
使用嵌入式Python - 4分
嵌入式Python需要一个特定的docker image,例如:
intersystemsdc/iris-ml-community:2020.3.0.302.0-zpm
了解相关 视频.
点此模板 ,了解嵌入式Python如何工作,以及如何制作ZPM包进行部署。
使用InterSystems Native API - 3分
如果您在您的全栈应用程序中使用以下任一 InterSystems Native API 选项访问数据,则可以获得该奖励: .NET, Java, Python, Node.js. 点击 此处 了解更多。
使用InterSystems JDBC- 2分
InterSystems IRIS 提供了用于访问数据的 JDBC 驱动程序。 如果您在您的全栈应用程序中使用 SQL 和 InterSystems JDBC 引用数据,您将获得该奖励。
多模型奖励
InterSystems Global(键-值)- 2 分
InterSystems Global 是 InterSystems IRIS 中用于存储任何数据的多维稀疏数组。 每个 Global 节点都可以被视为一个键,您可以为其设置一个值。InterSystems IRIS 提供一组 API(包括 ObjectScript 命令和Native API)来管理 Global。
工具:
在管理门户中管理globals
文档:
使用多维存储 (Globals)
使用Globals
帖子:
Globals are Magic Swords for managing data
The art of mapping Globals to Classes
视频:
Globals 快速入门
如果您在应用程序中通过 ObjectScript 或Native API使用 Global,则可以获得 2 分奖励。
InterSystems SQL - 2 分
InterSystems IRIS 提供了通过 ObjectScript、REST API、JDBC 对数据进行 SQL 访问的能力。
工具:
VSCode SQL Tools
DBeaver
SQL in Management Portal
Other SQL tools
文档:
SQL Access
InterSystems SQL Reference
帖子:
Class Queries in ObjectScript
视频:
SQL Things you should know
如果您的应用程序使用了 InterSystems SQL,则可以获取 2 分奖励。
InterSystems Objects - 2分
InterSystems IRIS 提供了通过 ObjectScript/REST API、Java/.NET/Node.js/Python 的Native API 和 Java/.NET 的 XEP 在 global 中存储和更改对象实例的方法。
文档:
Object Access
如果您的应用程序中使用了对象访问,则可以获得 2 分奖励。
您的数据模型- 2 分
InterSystems IRIS 可以用作公开您自己的数据模型 API 的数据平台。您可以使用 ObjectScript、REST API 或Native API 来公开您自己的 API,以提供任何特殊数据模型,例如时序、空间、图表、RDF/三元组、列存储、文档存储。
引入任意新数据模型 API,可获得 2 分奖励。
IRIS Analytics奖励
InterSystems IRIS BI - 2分
InterSystems IRIS 业务智能是 IRIS 的一项功能,通过它可以针对 IRIS 中的持久数据创建 BI 多维数据集和数据透视,然后使用交互式仪表板将此信息传递给用户。 Learn more.
基本的 iris-analytics模板 包含 IRIS BI 多维数据集、数据透视和仪表板的示例。
InterSystems IRIS NLP (iKnow) - 2分
InterSystems NLP(又名 iKnow)是一项 InterSystems IRIS 功能,并且是一个自然语言处理库,可以识别英语、德语、荷兰语、法语、西班牙语、葡萄牙语、瑞典语、俄语、乌克兰语、捷克语和日语等自然语言文本中的实体(短语)及其语义上下文。
Learn more about iKnow on Open Exchange.
示例:
Covid iKnow Text Navigator
Samples Aviation
and more
使用 iKnow 管理您的分析解决方案中的非结构化数据,可以获得 1 分奖励。
InterSystems Reports - 3 分
InterSystems Reports 是 InterSystems IRIS 的一项功能,通过它可以设计打印报告,按计划通过电子邮件发送报告,以及为客户提供交互式报告。 InterSystems Reports 是 Logi Analytics® 的产品 Logi Report(以前名为 JReport®)的重新打包。 Learn more in Documentation.
查看InterSystems Reports的 Github示例仓库.
另请观看InterSystems Reports 演示视频 ,并在 Learning Lab 亲自尝试。
您可以在WRC 的下载部分中下载 InterSystems Reports 设计器和服务器。
InterSystems Reports 设计器和服务器的许可证密钥将在Discord中提供。
AI/ML
IntegratedML - 3
IntegratedML 是 InterSystems IRIS 的一项功能,它通过一组 ML 指令扩展了 SQL,可以使解决方案中的 AI 和机器学习计算简化和自动化。了解有关 IntegratedML.
您需要专门的 IRIS 映像才能使用 IntegratedML,请点击查看 here.
示例:
一个基本的integratedML模板
Open Exchange上的几个示例
在您的 IRIS Analytics 解决方案中使用 IntegratedML 可让您获得 1 分奖励。
2. 使用Python网关 - 2 分
Python网关 InterSystems IRIS 的一个加载项,它提供了在 InterSystems IRIS 环境中使用 Python 的方法:
执行任意 Python 代码
将数据从 InterSystems IRIS 无缝传输到 Python 中
使用 Python 互操作性适配器构建智能互操作性业务流程
从 InterSystems IRIS 保存、检查、修改和恢复 Python 上下文。
了解更多 关于Python网关.
您可以使用 Python 网关模板 其中也包括了 IntegratedML。
互操作性奖励
使用业务流程 BPL 或业务规则 - 2 分
IRIS 互操作性产品 的主要功能之一是业务流程,它可以通过 BPL(业务流程语言)进行描述。
在文档中了解有关业务流程的更多信息.
业务规则是一种无代码/低代码方法,用于管理互操作性产品的处理逻辑。 在 InterSystems IRIS 中,可以直接或通过 ObjectScript 表示形式来创建业务规则。
如果您在互操作性产品中创建并使用业务流程或业务规则,则可以获得业务流程/业务规则奖励。
业务规则示例
在文档中了解有关业务规则的更多信息
使用自定义互操作性适配器- 2分
InterSystems 互操作性产品可以包含入站或出站适配器,这些适配器被业务服务和产品操作用来与外部系统进行通信。 您可以使用现有适配器(例如文件或电子邮件),也可以开发您自己的适配器。
如果您开发自己的自定义入站或出站适配器,并在您的产品中使用它,您会获得该奖励。
适配器示例
了解有关适配器的更多信息
使用产品扩展 (PEX) - 4 分
PEX 是互操作性产品的 Java 或 .NET 扩展。
如果您在您的互操作性产品中使用 JAVA 或 .NET 的 PEX,则会获得此奖励。
PEX演示
在文档中了解更多PEX相关信息
使用工作流程引擎 - 2分
工作流程引擎是 IRIS 互操作性的一部分,可用于自动在用户之间分配任务。
如果您在您的互操作性产品中使用工作流程引擎,则会获得此奖励。
在文档中了解有关工作流程的更多信息
社区模块 WorkflowAPI 和 WorkflowUI-ngx 在 Angular 上为工作流程引擎提供了一个漂亮的 UI 层。
FHIR奖
使用 FHIR Server REST API - 3 分
如果您在 InterSystems IRIS for Health 中使用 FHIR Server 的 REST API 端点,则会获得此奖励。 您可以采用IRIS-FHIR-Template,它会在 docker 映像构建期间准备 FHIR Server。 FHIR API 4.0.1 的文档可以在 此处找到.点击InterSystems IRIS医疗版文档了解更多。
使用 FHIR SQL 架构 - 2分
如果您在应用程序的 SQL 查询中使用 FHIR SQL 架构,则可以获得此技术奖励。 例如,您可以使用此架构来构建 FHIR Analytics 解决方案。 使用 HSFHIR\_I0001\_R 表示完整资源的资源架构,使用 HSFHIR\_I0001\_S 架构通过 SQL 搜索资源。 请查看 模板.
医疗保健标准转换- 3 分
InterSystems IRIS for Health 包含医疗保健互操作性模块,这些模块有助于执行从不同的医疗保健标准到 FHIR 的数据转换,反之亦然。 在您的应用程序中执行 CDA 到 FHIR、HL7v2 到 FHIR 或任何其他转换可获得此奖励。 请参见 HL7v2 to FHIR 和 CDA to FHIR 的转换示例. 点击文档了解更多信息。
奖励列表可能会有变化。 敬请关注!
文章
Claire Zheng · 三月 23, 2021
2021年3月19日,在InterSystems极客俱乐部首次进行的直播课中,InterSystems中国技术支持专家杨乐乐( @Ida.Yang )介绍了“InterSystems全球响应中心服务”,InterSystems全球响应中心(Worldwide Response Center)提供的全面服务以及独特之处,更重要的是,作为InterSystems用户,您将如何获取快速响应、并高效得到您想要的技术支持服务。
公告
Claire Zheng · 三月 25, 2021
亲爱的社区开发者们,大家好!
欢迎了解InterSystems编程大赛的最新投票规则!
详情如下:
您可以根据自己的判断选择三个项目进行投票,选出您心目中的一、二、三名。您对每个项目的提名会为该项目提供相应分数,根据您的级别和资格,分数会有所不同。以下是社区排行榜说明:
社区(Community)提名投票计分方式
如果您满足以下条件
提名
第一名
第二名
第三名
如果您在DC上发布过帖子,且在Open Exchange上传过App
9
6
3
如果您在社区发布过至少一篇帖子,或者在Open Exchange上传过至少一个App
6
4
2
如果您在社区进行过有效贡献(包括发表评论/提问等等)
3
2
1
专家(Experts)提名投票计分会有更复杂的数学计算,不同级别的专家有更多的“点数”权力:
专家(Experts)提名投票计分方式:
级别
提名
第一名
第二名
第三名
Global Maters VIP级 & InterSystems产品经理
15
10
5
Global Master 大使级(Ambassador)
12
8
4
Global Master专家级(Expert)& 社区管理员/版主
9
6
3
Global Master专业级(Specialist)
6
4
2
Global Master初级倡导员(Advocate)& InterSystems员工
3
2
1
系统会根据您的级别,对社区(Community)提名和专家(Experts)提名分别自动计票。
请看投票演示(请注意您提名项目的分数变化):
为了顺利参加投票,您需要:
登录 Open Exchange – 利用开发者社区账号即可
确保您在开发者社区进行过有效贡献——回答问题、提问、发帖、在Open Exchange上传应用程序——然后您就可以进行投票了。 点击了解如何成为社区“活跃”用户 。
我们希望新的投票规则能带来更公平的竞赛环境,您可以为您心仪的项目大胆投票!
欢迎跟帖评论,告诉我们您的建议!