CIMスキーマ

メタスキーマのエレメントは、クラス、プロパティ、およびメソッドです。メタスキーマは、クラスのタイプとして指示と関連付けをサポートし、プロパテイのタイプとして参照をサポートします。

クラスは、クラス間のサブタイプの関係を表す汎化階層に配列できます。汎化階層は、ルート有向グラフであり、多重継承はサポートしていません。

通常のクラスには、ブール、整数、文字列などの組み込みタイプのスカラまたは配列のプロパティを含めることができます。組み込みクラスや他のクラスへの参照を含めることはできません。

関連付けとは、複数の参照が含まれる特別なクラスです。複数のオブジェクトの関係を示します。関連付けを定義する方法によって、関連するクラスに影響を与えることなくクラス間の関係を確立できます。つまり、関連付けを追加しても、関連するクラスのインタフェースには影響を及ぼしません。関連付けのみが参照を持つことができます。

次の図のスキーマのフラグメントは、ZENworks for Desktopsが使用するCIMオブジェクト間の関係を示しています。


RDBMSスキーマにマッピングするCIMスキーマ

この図は、CIMスキーマがリレーショナルDBMSスキーマにマッピングする方法を示しています。クラスはクラス名と共にボックスの見出しに示されています。関連付けは、2つのクラスを結ぶ線の間に示されています。

このスキーマのフラグメントの継承階層は、次のCIM 2.2スキーマの図に示されています。参照はRefタイプとして太字で示され、参照のタイプを限定する各関連付けのサブタイプも示されています。


CIM 2.2スキーマとその継承階層


CIM対リレーショナルマッピング

CIMは、クラス、継承、ポリモフィズムを備えたオブジェクトモデルです。生成されたリレーショナルスキーマへのマッピングは、こうした特徴を最大限に保持します。リレーショナルマッピングの一部として、次の2つの側面があります。

データベースのテーブルは、CIM階層の各クラスを表します。テーブル内の対応するタイプの列は、そのクラスの非継承プロパティを示します。各テーブルには、プライマリーキーid$があります。このキーはインスタンスを一意に識別する64ビットの整数です。CIMクラスのインスタンスは、継承階層のクラスに対応するテーブルの行に示されます。各行には、id$と同じ値が含まれています。

各CIMクラスは、id$を使用して継承階層内のテーブルの行を結合し、そのクラスのインスタンスに対して複合プロパティ(継承とローカル)を生成するビューによっても示されます。ビューには、インスタンスの実際の(終端の)クラスのタイプを表す整数タイプの列class$も含まれています。

関連付けは、通常のクラスと同じ方法でマッピングされ、参照プロパティは、参照するオブジェクトインスタンスのid$フィールドがある列で示されます。このため、関連付けの参照フィールドと参照するテーブルのid$フィールドを結合して、関連付けを確認できます。

次の図は、このマッピングを使用する一般的な照会を示しています。


ネットワーク上の全コンピュータを検索する照会

この照会は、特定のネットワークセグメントに接続されている全コンピュータを検索します。関連するクラスと関係は、太枠で強調して示されています。

次のトピックでは、両方のスキーマタイプについて説明します。


論理スキーマ

論理スキーマは、データペースおよびアプリケーションプログラムのユーザが見ることができるデータベーススキーマです。このスキーマは、ストアドプロシージャとビューで構成されています。基になるテーブルは、アプリケーションから見えません。

通常、CIMクラスには次のものが含まれています。

ZENworks for Desktopsのインベントリコンポーネントは、JDBCを使用してRDBMSにSQL文を発行し、RDBMSデータタイプとJavaデータタイプを変換します。JDBCにストアドプロシージャとビューを使用すると、基になるデータベーステクノロジから、また物理スキーマの変更からアプリケーションコードを隔離する一定の抽出を実行できます。

論理スキーマのエレメントの詳細については次の節で説明します。


スキーマエレメントの命名

データベーススキーマではCIM名を変更しないで使用することをお勧めします。命名規則には次のような相違点があるため、問題が発生する場合があります。

これらの問題は、スキーマの生成中に、CIM名の大文字小文字を維持する、30文字より長い名前を短縮する、および予約語を結合した名前を引用符で囲むことで回避できます。

28文字より長い名前は、28文字以下のルート名に短縮されて2文字のプレフィックスを付けることができるため、SQLスキーマエレメントでそのルート名を使用できます。短縮アルゴリズムによって、名前は記憶しやすく認識可能で、その範囲内で固有の名前になるように短縮されます。短縮された名前には、他の名前との競合を避けるためにサフィックスとして#文字が付けられます(CIMでは#は無効な文字であることに注意してください)。同じ範囲内の複数の名前が同じ形に短縮された場合、他の名前と区別するために1桁追加されます。たとえば、AttributeCachingForRegularFilesMinは、AttCacForRegularFilesMin#に短縮されます。

このような短縮された名前はすべて、プログラムが本来のCIM名を検索して短縮名を取得し、SQLで使用できるように、短縮名テーブルに書き込まれます。

ビューは、アプリケーションコードと照会によって最もよく操作されるスキーマエレメントです。ビューが表すCIMクラスと同じ名前を使用します。たとえば、CIM_UnitaryComputerSystemクラスは、CIM.UnitaryComputerSystemという名前のビューで表されます。

必要に応じて、クラス名とプロパティ名を結合して$文字で区切り、インデックスと補助テーブルを作成します。通常、これらの名前は短縮されます。たとえば、NetworkAdapter$NetworkAddressesは、NetAdapter$NetAddresses#に短縮されます。これは、ZENworks for Desktopsスキーマユーザに悪影響を及ぼすことはありません。


ユーザと役割

SQLでは、スキーマと同じ名前のユーザがスキーマの所有者です。たとえば、CIM、ManageWise(R)、ZENworks(R)などです。

また、データベース管理者特権と全スキーマオブジェクトへのアクセス権を持つMW_DBAユーザがいます。MW_Readerの役割には全スキーマオブジェクトへの読み込み専用アクセス権があり、MW_Updaterの役割には全スキーマオブジェクトへの読み込みと書き込み、および実行のアクセス権があります。

アプリケーションプログラムは、要件に応じて、SybaseデータベースにはMW_ReaderまたはMW_Updater、OracleデータベースにはMWO_ReaderまたはMWO_Updater、MS SQL Server 2000データベースにはMWM_ReaderまたはMWM_Updaterのいずれかとしてアクセスする必要があります。


データタイプ

CIMデータタイプは、データベースが備えている最適なデータタイプにマッピングされます。通常、Javaアプリケーションは、JDBCを使用してデータにアクセスするため、タイプを必要としません。

Javaは本来符号なしのタイプをサポートしていないため、符号なしのタイプを表す次のサイズのクラスまたは整数タイプを使用する必要があります。また、データベースの読み書き中に問題が発生しないようにします。たとえば、データベースの符号なしフィールドに負の数を読み書きすると、エラーが発生することがあります。

CIMおよびJavaの文字列はUnicodeであるため、データベースはUTF8文字セットを使用して作成します。国際化対応によって問題が発生することはありませんが、照会における大文字と小文字の区別によって問題が発生することがあります。

すべてのデータベースでは、データベース内に保存されている文字列データの大文字と小文字が保持されますが、照会中は大文字と小文字が区別されるデータまたは区別されないデータのいずれかとしてデータにアクセスします。ZENworks for Desktopsでは、照会されるデータは照会前にデータベースから取得され、大文字と小文字は自動的に区別されるため、Inventory QueryコンポーネントとData Exportコンポーネントは影響を受けません。

CIMでは、最大文字列サイズで、または最大文字列サイズなしで文字列を指定できます。多くの文字列には指定サイズはありません。つまり、文字列の長さは無制限です。効率性の観点から、この長さが無制限の文字列は、最大サイズが254文字の変数文字列にマッピングされます。最大サイズのCIM文字列は、同じサイズの変数データベース文字列にマッピングされます。データベース内では、Unicode文字の保存には複数バイトが必要なため、サイズは文字ではなくバイトで表します。


ビュー

CIMクラスは、そのクラスのローカルプロパティと継承した非配列プロパティをすべて含むビューによって、データベースに示されます。ビューにはCIMクラスと同じ名前が付けられます。たとえば、次の図に示されているように、CIMクラスCIM_Systemは、CIM.Systemという名前のSQLビューで表されます。

CIM.Systemビューは、複数のテーブルから選択される属性によって作成されます。該当する属性は、cim.t$ManagedSystemElementから選択されるid$、mw_dba.extractClass関数を使用して自動的に入力されるclass$、cim.t$ManagedSystemElementから選択されるCaption、cim.t$ManagedSystemElementから選択されるDescription、cim.t$ManagedSystemElementから選択されるInstallDate、cim.t$ManagedSystemElementから選択されるStatus、cim.t$Systemから選択されるCreationClassName、cim.t$ManagedSystemElementから選択されるName。cim.t$System.NameFormatから選択されるNameFormat、cim.t$Systemから選択されるPrimaryOwnerContact、cim.t$Systemから選択されるPrimaryOwnerNameです。ビューは、同じid$を持つCIM.t$ManagedSystemElementテーブルとCIM.t$Systemテーブルを結合して作成されます。

cim.systemビューは次のとおりです。

CREATE VIEW CIM.System
{
  id$, 
  class$,
  Caption,
  Description,
  InstallDate,
  Status,
  CreationClassName,
  Name,
  NameFormat,
  PrimaryOwnwerContact,
  PrimaryOwnerName
}
AS SELECT
  CIM.t$ManagedSystemElement.id$
  MW_DBA.extractClass(CIM.t$ManagedSystemElement.id$),
  CIM.t$ManagedSystemElement.Caption,
  CIM.t$ManagedSystemElement.Description,
  CIM.t$ManagedSystemElement.InstallDate,
  CIM.t$ManagedSystemElement.Status,
  CIM.t$System.CreationClassName,
  CIM.t$ManagedSystemElement.Name,
  CIM.t$System.NameFormat,
  CIM.t$System.PrimaryOwnerContact,
  CIM.t$System.PrimaryOwnerName
FROM
  CIM.t$ManagedSystemElement,
  CIM.t$System
WHERE
  CIM.t$ManagedSystemElement.id$ = CIM.t$System.id$

クラスのプロパティの他に、ビューには次の2つのフィールドがあります。

ビューはSELECT文を使用して照会でき、UPDATE文を使用して更新できます。ビューはINSERT文およびDELETE文を使用できないため、コンストラクタプロシージャとデストラクタプロシージャを使用します。


オブジェクト識別子Id$

Id$は、クラスの特定のインスタンスを一意に識別する64ビットのオブジェクト識別子です。たとえば、CIM_Processorクラスのインスタンスです。通常、このオブジェクト識別子は特定のインスタンスへの不透明なハンドルとして使用されます。Id$は、長いデータタイプと同じようにJavaでの操作を簡単にするために符号付き数値として設計されています。

Id$には、次の3つの部分の情報が含まれています。これらは適切なストアドプロシージャを呼び出して抽出できます。

id$フィールドは、クラスのインスタンスへの不透明なハンドルとしてそのまま使用されます。関連付けクラスが2つのクラスのインスタンスの関係を表している場合、関連付けの参照フィールドには、参照されたインスタンスのid$が(ポインタのように)保持されます。このため、id$とその参照フィールドは、複数のビューを参照するデータベース照会を作成するときに、Join条件でよく使用されます。


コンストラクタ

具象(非抽象)CIMクラスには、クラスのインスタンスを作成するときに呼び出す必要があるコンストラクタストアドプロシージャがあります。このストアドプロシージャには、ユーザがクラスの各プロパティ値を指定するための入力パラメータ、および作成したインスタンスに割り当てられたid$を返す1つの出力パラメータがあります。アプリケーションは、この返されたid$値を使用して、特定のインスタンスを参照する関連付けクラスを作成します。

コンストラクタ名はルート名の前にc$が付き、各パラメータ名はルートプロパティ名の前にp$が付きます。たとえば、CIM_SystemのサブクラスであるCIM_UnitaryComputerSystemのコンストラクタは、CIM.c$UnitaryComputerSystemという名前が付けられます。Oracleの場合は、次の例で示されているように作成されます。

CREATE PROCEDURE CIM.c$UnitaryComputerSystem

(

p$id$  OUT NUMBER,
p$Caption IN CIM.t$ManagedSystemElement.Caption%TYPE DEFAULT  NULL,
p$Description IN CIM.t$ManagedSystemDescription%TYPE DEFAULT NULL,
p$InstallDate IN CIM.t$ManagedSystemElement.InstallDate%TYPE DEFAULT NULL,
p$Status IN CIM.t$ManagedSystemElement.Status%TYPE DEFAULT NULL,
p$CreationClassName IN CIM.t$System.CreationClassName%TYPE DEFAULT NULL,
p$Name IN CIM.t$ManagedSystemElement.Name%TYPE DEFAULT NULL,
p$PrimaryOwnerContact IN CIM.t$System.PrimaryOwnerContact%TYPE DEFAULT NULL,
p$PrimaryOwnerName IN CIM.t$System.PrimaryOwnerName%TYPE DEFAULT NULL,
p$NameFormat IN CIM.t$System.NameFormat%TYPE DEFAULT NULL,
p$LastLoadInfo IN CIM.t$UnitaryComputerSystem.LastLoadInfo%TYPE DEFAULT NULL,
p$ResetCapability IN CIM.t$UnitaryComputerSystem.ResetCapability%TYPE DEFAULT NULL,
p$PowerManagementSupported IN CIM.t$UnitaryComputerSystem.PowerManagementSupported%TYPE DEFAULT NULL,
p$PowerState IN CIM.t$UnitaryComputerSystem.PowerState%TYPE DEFAULT NULL
)IS
  temp NUMBER;
BEGIN
  LOOP
  SELECT CIM.s$UnitaryComputerSystem.NEXTVAL INTO temp FROM DUAL;
  SELECT MW_DBA.makeId(240, temp) INTO temp FROM DUAL;
  EXIT WHEN MOD(temp,100) != 0;
  END LOOP; 
  p$id$ := temp;
INSERT INTO CIM.t$ManagedSystemElement (id$, classOid$, Caption, Description, InstallDate, Status, Name)VALUES(p$id$, HEXTORAW('0302100203'), p$Caption, p$Description, p$InstallDate, p$Status, p$Name);
INSERT INTO CIM.t$System (id$, CreationClassName, PrimaryOwnerContact, PrimaryOwnerName, NameFormat)VALUES(p$id$, p$CreationClassName, p$PrimaryOwnerContact, p$PrimaryOwnerName, p$NameFormat);
INSERT INTO CIM.t$UnitaryComputerSystem (id$, LastLoadInfo, ResetCapability, PowerManagementSupported, PowerState) VALUES(p$id$, p$LastLoadInfo, p$ResetCapability, p$PowerManagementSupported, p$PowerState);
END;

ストアドプロシージャは、位置引数とキーワード引数のいずれか、またはこの2つで呼び出すことができます。位置引数を使用する場合、キーワード引数より前に置く必要があります。コンストラクタストアドプロシージャを呼び出す場合は、常にキーワード引数を使用します。これによって、追加パラメータの挿入処理または既存パラメータの記録処理が必要になるCIMスキーマの変更から影響を受けないようになります。このいずれの処理も、検出できない方法で位置呼び出しを中断することがあります。このプロシージャは、省略されたパラメータがデフォルトでNULLとなるように生成されます。

第1パラメータp$id$には位置表記を使用できます。このパラメータは、新しく作成されたインスタンスのオブジェクト識別子を返す出力パラメータです。

次のJDBCコード例は、Sybaseで第1引数に位置表記を、それ以降の引数にキーワード表記を使用して、ストアドプロシージャを呼び出す方法を示しています。

CallableStatement CS = 
conn.prepareCall( "{call CIM.c$UnitaryComputerSystem( ?,  p$Name=?, p$Description=?)}")
cs.registerOutParameter ( 1, java.sql.Types.BIGINT ); //id$
cs.setString( 2, "Bogus_UCS_1") ; //Name
cs.setString( 3, "Created with mixture of positional & keyword args" ); // Description
cs.executeUpdate();
long id = cs.getLong ( 1 );
SQLWarning w = cs.getWarnings();
if( w != null )
  printWarnings( w );
else
  System.out.println("Created UCS id$ = " + id );

キーワード表記の構文は、Sybase ASA、MS SQL 2000、およびOracleでは異なります。Sybase ASAおよびMS SQL 2000では、構文はKEYWORD=valueです。Oracleでは、構文はKEYWORD => valueです。適切に記述されたコードは、使用するデータベースに適した構文を使用して、呼び出し文字列を動的に作成します。


デストラクタ

非抽象CIMクラスには、クラスのインスタンスを破壊するために呼び出されるデストラクタストアドプロシージャがあります。このストアドプロシージャには、破壊されるインスタンスのオブジェクト識別子(id$)を指定し、値を返さない入力パラメータが1つだけあります。

デストラクタは、継承チェーン内の行および破壊されるインスタンスを参照する関連付けを含む、関連する全テーブルから該当する行を削除します。関連付けのみが破壊され、関連する関連付けオブジェクトは破壊されません。関連付けを破壊する必要がある場合、プログラマはオブジェクトが破壊されないようにする必要があります。デストラクタの名前にはルート名の前にd$が付き、オブジェクト識別子パラメータにはp$id$という名前が付けられます。このプロシージャは、位置表記を使用して呼び出します。たとえば、CIM_Systemの具象サブクラスであるCIM_UnitaryComputerSystemのデストラクタは、CIM.d$UnitaryComputerSystemという名前になります。


物理スキーマ

物理スキーマは、データベースの実装に必要なエレメントで構成されています。物理スキーマはデータベースによって異なります。一般的な物理スキーマは次のもので構成されています。

論理スキーマは、物理スキーマの上に配置し、ユーザやアプリケーションが物理スキーマを認識する必要がないようにします。