記事
· 2023年3月28日 3m read

テーブル名、カラム名、インデックス名の変更方法

これは InterSystems FAQ サイトの記事です。
 

テーブル名/カラム名/インデックス名を変更したい場合、以下のケース別に変更方法をご案内します。

A. テーブル名・カラム名の変更
B. インデックス名の変更
 

-------------------------------------------------------------------------
A. テーブル名・カラム名の変更する方法
-------------------------------------------------------------------------

テーブル(クラス)名とカラム(プロパティ)名は基本的には変えないようにしてください。

もし「SQLアクセス時の名前だけ変更したい」場合は、以下のように新しい名前を SqlTableName(テーブル名)、SqlFieldName(カラム名) として指定することができます。

Class User.test Extends %Persistent [ SqlTableName = test2 ] {
    Property p1 As %Integer [ SqlFieldName = xx ];
    ....


以後 "SELECT xx from test2" としてアクセス可能になります。
こちらの方法の場合は、スタジオで定義を記述し、再コンパイルすると即座に反映されます。


どうしてもクラス名を変更したい場合は以下の(1)、プロパティ名を変更したい場合は以下の(2)が必要となります。

(1) クラス名変更はできないため、新規クラス作成し、定義を丸ごとコピーする必要があります。
   コピーには、スタジオの「ツール > クラスをコピー」を使用できます。
   ストレージ定義やクラス名のインスタンスもすべてコピーする場合は、以下のようにチェックを入れます。


※元のクラスは、新規クラスをコンパイルする前にコマンドで削除してください。
 以下の実行例を参考にしてください。

実行例:
USER>do $SYSTEM.OBJ.Delete("User.Test")
 
クラスを削除中 User.Test
USER>write ##class(%ExtentMgr.Util).DeleteExtentDefinition("User.Test","cls")
1


(2) プロパティ名変更は、スタジオで定義を変更するだけです。
   ただしグローバルのストレージ場所が変わらないように、手動でストレージ情報を編集する必要があります。

【注意】
クラス名やプロパティ名を変える場合、手順を間違えると 
enlightened【ご参考】にある関連トピックのような問題が発生します。
十分に注意した上で行うようにしてください。

 

-----------------------------------------------------
B. インデックス名の変更
-----------------------------------------------------

インデックス名の変更については、以下の手順になります。
旧インデックスを削除 → スタジオでインデックス名を変更 → 新インデックス再構築


【例】Index a1  を Index b1 に変更する場合

(1) インデックスa1データ削除

do ##class(User.test).%PurgeIndices($LB("a1"))

(2) スタジオでインデックス名を変更し、コンパイル

(3) インデックス b1データ再構築

do ##class(User.test).%BuildIndices($LB("b1"))

 

enlightened【ご参考】
クラス定義でプロパティ名を変更するとそれまで参照できていたデータが参照できなくなる/参照時にエラーが発生する場合の対処方法

ディスカッション (0)0
続けるにはログインするか新規登録を行ってください