CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系
一些熟悉SQL的用户希望用SQL表的方式获取InterSystems IRIS/Caché的变更数据。知道了Global和SQL表的对应关系,就可以知道是哪一张SQL表数据变化了,甚至通过SQL查询获取变更的数据。
下面介绍如何实现这种方式,和注意事项。
获取Global和SQL表的对应关系
通常InterSystems IRIS/Caché的持久化的对象模型(类)和SQL表之间有一一对应的关系;而持久化的对象模型和Global之间也有一一对应关系。建立Global和SQL表的对应关系,通常可以使用以下的SQL查询特定SQL schema下所有表对应的Global:
SELECT CC.SqlQualifiedNameQ SQLTable, CS.parent Class, CS.DataLocation
FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC
WHERE CS.parent = CC.ID
AND CC.SqlSchemaName= <schemaname>
其中<schemaname>
是SQL的Schema名称; 返回字段SQLTable是SQL表名、Class是对象类名、DataLocation是保存数据的Global名称。
多种建模方式Global和SQL表的对应关系的影响
InterSystems IRIS/Caché都是支持多种建模方式的数据平台,常见的建模方式有SQL、面向对象、多维数组。如果之前不了解InterSystems IRIS/Caché的多维数组,可以先简单理解为键值对。
无论使用何种建模方式,都可以得到3套模型:SQL模型、对象模型和多维数组存储模型(Global模型)。
上面提到通常InterSystems IRIS/Caché的持久化的对象模型(类)和SQL表之间有一一对应的关系。但由于SQL表达模型的局限性, InterSystems IRIS/Caché的对象模型和SQL表之间并不总是一一对应的关系。
下面就逐一分析各种建模方式下,如何分析和获取Global和SQL表的对应关系。
1. 基于SQL建模
如果InterSystems IRIS/Caché模型就是用SQL建模的,查找Global和SQL表的对应关系很简单:对象模型是基于SQL模型自动创建的,因此它们之间是一对一的关系。
这是,在Caché里,编译出的Storage 类型为%Library.CacheStorage;在InterSystems IRIS里,编译出的Storage 类型为%Storage.Persistent。
可以执行SQL查询:
SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation
FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC
WHERE CS.parent = CC.ID
AND CC.SqlSchemaName= <schemaname> AND type='%Library.CacheStorage'
其中<schemaname>
是SQL的Schema名称,如果Schema里有“_”,应将其去掉。
Parent字段是SQL表对应的类名,DataLocation是保存数据的Global名称。
而Global的第一个下标就是行号/Id字段。
例如使用DDL创建一个table:
Create table Demo.Mytable(name varchar(20), notes varchar(100))
通过上面的SQL查询,DataLocation为Demo.MytableD。那么Journal中所有对于Global为Demo.MytableD的操作就是对表Demo.Mytable的记录操作。例如^Demo.MytableD(123), 就是对行号/Id字段为123的Demo.Mytable记录到操作,从而可以通过SQL: SELECT name, notes from Demo.Mytable WHERE id = 123
获取这条变更的记录。
2. 基于对象建模
如果InterSystems IRIS/Caché模型是使用对象建模的,查找Global和SQL表的对应关系有时并不那么简单。
例如以下描述患者及地址的简单对象模型:
Class Demo.Address Extends %SerialObject
{
Property Type As %String;
Property City As %String;
Property Street