[DBMoto] テーブル一括作成機能使用時にカラムを追加し、自動で関数を割り当てる方法


DBMotoの特徴の1つとして、ターゲットテーブル作成機能があります。

この機能を使用することでターゲットDBにテーブルが存在しない場合でも
ソースDBのテーブル定義と同じ定義でターゲットに最適なデータ型、カラム長で
テーブルを作成することがで可能です。

また大規模な環境の場合でも一括作成機能を使用することで
ソースDBのテーブルをまとめてターゲットDBに同じテーブルを作成することができます。

またグローバルスクリプトを使用することで、この一括作成機能を使用する際に、
ターゲットテーブルに対してカラムを追加し、自動で関数を割り当てることが可能です。
グローバルスクリプトは、DBMotoのコンソールの下記赤枠より定義することができます。

以下のスクリプトは、ターゲットテーブルを作成する際に自動的に「day」というカラムを追加し、
Now関数を割り当てて更新日時を自動的に反映させる一例です。
このようにグローバルスクリプトにテーブル作成時のルールを定義することで、
大規模な環境でのテーブル作成時の手間を減らすことができます。

using System;
using System.Data;
using DBMotoPublic;
using DBMotoScript;
using System.Collections.Generic;
using System.Collections;

namespace DBRS
{
public class GlobalScript : IGlobalScript
{

}

public class CreateTableRule : ICreateTableRule
{
[CreateTableRuleAttribute("Audit Table New", "Create columns for an audit replication")]

public bool MyCustomAuditTable (List<ColumnClass> aTargetFields)
{
ColumnClass colClass;
colClass = new ColumnClass();
colClass.Name = "day";
colClass.AllowNull = true;
colClass.TypeName = "datetime";
colClass.Size = 20;
aTargetFields.Add(colClass);

return true;
}

}

public class GlobalEvents : IGlobalEvents
{
}
public class ColumnClass
{
public string Name;
public int CCSID;
public string TypeName;
public int Size;
public int Precision;
public int Scale;
public int PrimaryKeyPos;
public bool AllowNull;
public string Default;
}

public class MappingRule : IMappingRule
{
[MappingRuleAttribute("Map For Audit Table", "Match names considering the additional fields on audit tables")]
public bool AuditTableMapping (bool bIsForth, string sSourceName, int iSourceOrdinal, string sSourceType, bool bIsSourcePrimaryKey, bool bIsSourceNullable, int iSourceSize, short sSourcePrecision, short sSourceScale, string sTargetName, int iTargetOrdinal, string sTargetType, bool bIsTargetPrimaryKey, bool bIsTargetNullable, int iTargetSize, short sTargetPrecision, short sTargetScale, ref System.Text.StringBuilder sExpression)

{
if (String.Compare(sTargetName, "day", true) == 0)
{
sExpression.Append("DateTime.Now");
return true;
}
else
{
return String.Compare(sSourceName, sTargetName, true) == 0;
}

}

}
}

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください