schemaPolicyMap

このページは、DBFlute-1.1.2 以降を前提としています。 (1.1.1 は機能が少ないため、SchemaPolicyCheckをしっかり使うなら 1.1.2 以降へのアップグレードをオススメします)

schemaPolicyMapとは?

SchemaPolicyCheck のためのポリシーを設定する dfprop です(@since 1.1.1)。この dfprop ファイルに設定が追加されると、Docタスクにて SchemaPolicyCheck が実行されます。

プロパティ

map型プロパティ で、JDBC型とプログラム型の関連を key-value 形式で定義します。

schemaPolicyMapの仕様 @schemaPolicyMap.dfprop
map:{
    ; tableExceptList = list:{ [table-hints for exccept] }
    ; tableTargetList = list:{ [table-hints for target] }
    ; columnExceptMap = map:{
        ; [table-hint] = list:{ [column-hints for exccept] }
    }
    ; isMainSchemaOnly = [true or false]

    ; wholeMap = map:{
        ; themeList = list:{ [themes] }
    }
    ; tableMap = map:{
        ; themeList = list:{ [themes] }
        ; statementList = list:{ [statements] }
    }
    ; columnMap = map:{
        ; themeList = list:{ [themes] }
        ; statementList = list:{ [statements] }
    }
}

theme は、DBFlute側が提供するお決まりのパターンポリシーです。例えば、tableMap にて upperCaseBasis とすれば、テーブル名は大文字であることがチェックされます。

statement は、アプリ側が独自に設定するポリシーです。"もし...だったら、これは...である" というような形式で指定します。

e.g. カラム名が _FLG で終わっていたら、データ型は INTEGER であること @schemaPolicyMap.dfprop
map:{
    ...
    ; columnMap = map:{
        ; themeList = list:{ ... }
        ; statementList = list:{
            ; if columnName is suffix:_FLG then dbType is INTEGER
        }
    }
}

以下、(*)の付いたプロパティは必須です。

tableExceptList

チェックの除外テーブルのリスト。

値候補
テーブル名のlist型プロパティ
デフォルト
なし (除外するものなし)
補足
  • tableTargetList の指定がされている場合は無効 (target優先)
  • 前方一致: "prefix:前方一致させる文字列" という形式で指定
  • 後方一致: "suffix:後方一致させる文字列" という形式で指定
  • 部分一致: "contain:部分一致させる文字列" という形式で指定
  • 正規表現: "pattern:マッチさせる正規表現文字列" という形式で指定
  • 正規表現を除き、大文字小文字の区別なし (ただし実体と合わせることを推奨)
  • 複数指定時は、and 条件として扱われる (e.g. Aでもない、Bでもない)

基本的な使い方は、databaseInfoMap.dfprop の tableExceptList と似ています。

tableTargetList

チェックの対象テーブルのリスト。(特に指定がなければ全テーブルが対象)

値候補
テーブル名のlist型プロパティ
デフォルト
なし (全テーブルが対象)
補足
  • 指定方法は、基本的に tableExceptList と同じ
  • 複数指定時は、and 条件として扱われる (A もしくは B)

基本的な使い方は、databaseInfoMap.dfprop の tableTargetList と似ています。

columnExcecptMap

チェックの除外カラムのリスト。(テーブル名とカラム名で指定なのでmap)

値候補
テーブル名とカラム名のmap型プロパティ
デフォルト
なし (全てのカラムが対象)
補足
  • テーブル名の指定では、tableExceptList のように prefix: などが使える
  • カラム名リストの指定方法は、基本的に tableExceptList と同じ

基本的な使い方は、databaseInfoMap.dfprop の columnExcecptMap と似ていますが、若干違う部分があります。 例えば、テーブル名での prefix: などの利用可否が違います(@now 1.1.2)

isMainSchemaOnly

チェックの対象が、メインスキーマだけかどうか? (AdditionalSchemaを除外するかどうか?)

値候補
テーブル名とカラム名のmap型プロパティ
デフォルト
なし (全てのカラムが対象)
補足
  • テーブル名の指定では、tableExceptList のように prefix: などが使える
  • カラム名リストの指定方法は、基本的に tableExceptList と同じ

AdditionalSchema のテーブルも一緒にチェックされます。 もし、スキーマごとにポリシーが違うとチェックがやりづらいので、メインスキーマだけに絞ることができます。

それぞれの AdditionalSchema に独自のポリシーを設定することはできないため、 AdditionalSchema のテーブルのポリシーチェックは、別途そのスキーマ専用のDBFluteクライアントを用意すると良いでしょう。

wholeMap

スキーマ全体に対するポリシー。themeList だけが利用できます。(statementListは不可)

e.g. テーブルの別名がユニーク、カラム名が同じならカラムの別名も同じ @schemaPolicyMap.dfprop
map:{
    ...
    ; wholeMap = map:{
        ; themeList = list:{ uniqueTableAlias ; sameColumnAliasIfSameColumnName }
    }
    ...
}

themeList

利用できる theme は以下の通りです。

uniqueTableAlias
テーブルの別名がユニークである
sameColumnAliasIfSameColumnName
カラム名が同じならカラムの別名も同じ
sameColumnDbTypeIfSameColumnName
カラム名が同じならカラムのデータ型も同じ
sameColumnSizeIfSameColumnName
カラム名が同じならカラムのサイズも同じ
sameColumnNameIfSameColumnAlias
カラムの別名が同じならカラム名も同じ

そもそも別名が定義されていないテーブルやカラムは比較対象になりません。 別名の必須チェックなどは、別途 tableMap や columnMap の statement にて表現すると良いでしょう。

statementList

wholeMap で statementList は利用できません。

tableMap

テーブルに対するポリシー。

e.g. テーブルに対するポリシー、別名がユニークとか、FKの名前がFK_とか @schemaPolicyMap.dfprop
map:{
    ...
    ; tableMap = map:{
        ; themeList = list:{ hasPK ; upperCaseBasis ; identityIfPureIDPK }
        ; statementList = list:{
            ; if tableName is $$ALL$$ then fkName is prefix:FK_$$table$$
        }
    }
    ...
}

table's themeList

利用できる theme は以下の通りです。

hasPK
全てのテーブルがPKを持っている
upperCaseBasis
テーブル名は大文字 (SQL上の名前で判定)
lowerCaseBasis
テーブル名は小文字 (SQL上の名前で判定)
identityIfPureIDPK
FKではない _ID のPKカラムにはIdentityが付与される
hasCommonColumn
共通カラムを持っている
hasAlias
別名が存在する (DBコメントの一部を別名として認識する設定が前提)
hasComment
テーブルのコメントが存在する (別名部分を除く)

upperCaseBasis, lowerCaseBasis の大文字小文字判定では、DBFluteが管理するSQL上のテーブル名 (ConditionBeanのSQLで利用) の大文字小文字ルールを利用します。例えば、upperCaseBasis をポリシーにしたとき、DBMSのメタデータが小文字であっても、littleAdjustmentMap.dfprop にて isTableSqlNameUpperCase が true に設定されていればセーフです。

identityIfPureIDPK は、Sequence では効果ありません。 また、テーブル除外設定はできないので、除外したいテーブルがある場合は statement の方で実現します。

hasCommonColumn は、共通カラムのすべてのカラムを持っていればOKです。

hasAlias は、documentMap.dfprop の aliasDelimiterInDbComment が設定されていることが前提です。 (DBFluteには、DBコメントの中の一部文字列を別名として扱う機能があります)

hasComment は、別名設定がされていれば、DBコメントから別名の除いた部分だけで比較されます。

table's statementList

if の主語

利用できる statement の if の主語は以下の通りです。

tableName
テーブル名 e.g. if tableName is prefix:CLS_
alias
テーブルの別名(和名) e.g. if alias is prefix:商品
pk_dbType
PKのデータ型 e.g. if pk_dbType is CHAR
pk_size
PKのデータサイズ、小数点はカンマ空白(*A) e.g. if pk_size is 3
pk_dbType_with_size
PKのデータ型サイズ付き e.g. if pk_dbType_with_size is CHAR(3)

(*A): 例えば、decimal型とかであれば、"8, 3" となる e.g. pk_size is 8, 3

then の "isなし" 表現

利用できる statement の then の isなし 表現は以下の通りです。

bad
もうそれダメ e.g. if ... is ... then bad
hasCommonColumn
共通カラムを持っているはず e.g. ... then hasCommonColumn

then の "isあり" 表現

利用できる statement の then の isあり 表現は以下の通りです。

tableName
テーブル名 e.g. then tableName is prefix:CLS_
alias
テーブルの別名(和名) e.g. then alias is prefix:商品
comment
テーブルのDBコメント(別名抜き) e.g. then comment is contain:sea
pkName
PK制約の名前 e.g. then pkName is prefix:PK_
fkName
FK制約の名前 e.g. then fkName is prefix:FK_
uniqueName
UQ制約の名前 e.g. then uniqueName is prefix:UQ_
indexName
インデックの名前 e.g. then indexName is prefix:IX_
pk_columnName
PKのカラム名 e.g. then pk_columnName is suffix:_CODE
pk_dbType
PKのデータ型 e.g. then pk_dbType is CHAR
pk_size
PKのデータサイズ、小数点はカンマ空白(*A) e.g. then pk_size is 3
pk_dbType_with_size
PKのデータ型サイズ付き e.g. then pk_dbType_with_size is CHAR(3)

(*A): 例えば、decimal型とかであれば、"8, 3" となる e.g. pk_size is 8, 3

否定表現 (not)

notが使えるパターンは以下の通りです。

if の is not
e.g. if tableName is not prefix:CLS_ then ...
then の not ...
e.g. if ... then not hasCommonColumn
then の is not
e.g. if ... then pkName is not prefix:KP_

かつ、もしくは (and/or)

大きく二つに分かれます。

文章の連結
e.g. if tableName is prefix:CLS_ and pk_dbType is CHAR then ...
値の連結
e.g. if tableName is prefix:CLS_ and suffix:_STATUS then ...
  • 文章の連結と値の連結を組み合わせて使うこともできる
  • 文章の連結の中で、and と or を混ぜて使うことはできない (and なら全部 and)
  • 値の連結の中で、and と or を混ぜて使うことはできない (and なら全部 and)
  • 文章の連結は and で、値の連結は or とかは大丈夫 (逆も同じ)

補足コメント (期待値など)

期待値などの補足を、statement自体に含めてコメントすることができます。すると、エラーになったときに一緒に表示されます。 (普通のdfpropのコメントだと、エラーでは表示されない)

then の後に続いて "=>" を付けて、その右側に自然言語でコメントを書きます。

e.g. statementの補足コメント @schemaPolicyMap.dfprop
map:{
    ...
    ; tableMap = map:{
        ; statementList = list:{
            ; if tableName is suffix:_ID then bad => カラムっぽいテーブル名ダメ
        }
    }
    ...
}

columnMap

カラムに対するポリシー。

e.g. カラムに対するポリシー、大文字とか、_FLG は NotNull とか @schemaPolicyMap.dfprop
map:{
    ...
    ; columnMap = map:{
        ; themeList = list:{ upperCaseBasis }
        ; statementList = list:{
            ; if columnName is suffix:_FLG then notNull
        }
    }
    ...
}

column's themeList

利用できる theme は以下の通りです。

upperCaseBasis
カラム名は大文字 (SQL上の名前で判定)
lowerCaseBasis
カラム名は小文字 (SQL上の名前で判定)
hasAlias
別名が存在する (DBコメントの一部を別名として認識する設定が前提)
hasComment
カラムのコメントが存在する (別名部分を除く)

(tableMapの方とほぼ同じ) upperCaseBasis, lowerCaseBasis の大文字小文字判定では、DBFluteが管理するSQL上のカラム名 (ConditionBeanのSQLで利用) の大文字小文字ルールを利用します。例えば、upperCaseBasis をポリシーにしたとき、DBMSのメタデータが小文字であっても、littleAdjustmentMap.dfprop にて isColumnSqlNameUpperCase が true に設定されていればセーフです。

(tableMapの方とほぼ同じ) hasAlias は、documentMap.dfprop の aliasDelimiterInDbComment が設定されていることが前提です。 (DBFluteには、DBコメントの中の一部文字列を別名として扱う機能があります)

(tableMapの方とほぼ同じ) hasComment は、別名設定がされていれば、DBコメントから別名の除いた部分だけで比較されます。

column's statementList

if の主語

利用できる statement の if の主語は以下の通りです。

tableName
テーブル名 e.g. if tableName is prefix:CLS_
column
カラムの特性(*後述) e.g. if column is notNull
columnName
カラム名 e.g. if columnName is suffix:_FLG
alias
カラムの別名 e.g. if alias is suffix:フラグ
dbType
カラムのデータ型 e.g. if dbType is CHAR
size
カラムのデータサイズ、小数点はカンマ空白(*A) e.g. if size is 3
dbType_with_size
カラムのデータ型サイズ付き e.g. if dbType_with_size is CHAR(3)

(*A): 例えば、decimal型とかであれば、"8, 3" となる e.g. pk_size is 8, 3

pk や unique などは、第一カラム第二カラムに関わらず構成カラムに含まれているかどうかを判定します。 classification は、DBFluteの設定として区分値登録されているかどうかを判定します。

then の "isなし" 表現

利用できる statement の then の isなし 表現は、ifの主語の "column is" で利用できる値と同じです。(bad や notNull など、後述)

これらは、"then column is ..." で代替できます。

then の "isあり" 表現

利用できる statement の then の isあり 表現は以下の通りです。

tableName
テーブル名 e.g. then tableName is prefix:CLS_
column
カラムの特性(*後述) e.g. then column is notNull
columnName
カラム名 e.g. then columnName is suffix:_FLG
alias
カラムの別名 e.g. then alias is suffix:フラグ
dbType
カラムのデータ型 e.g. then dbType is CHAR
size
カラムのデータサイズ、小数点はカンマ空白(*A) e.g. then size is 3
dbType_with_size
カラムのデータ型サイズ付き e.g. then dbType_with_size is CHAR(3)
comment
カラムのDBコメント(別名抜き) e.g. then comment is contain:sea

(*A): 例えば、decimal型とかであれば、"8, 3" となる e.g. pk_size is 8, 3

カラムの特性 (column is)

if column is ... や then ... や then column is ... で使える表現は以下の通りです。

notNull
NotNull制約 e.g. if column is notNull
identity
identityカラム(連番) e.g. if column is identity
pk
PK制約 e.g. if column is pk
fk
FK制約 e.g. if column is fk
unique
UQ制約 e.g. if column is unique
index
インデックス e.g. if column is index
classification
区分値 e.g. if column is classification

否定表現 (not)

tableMapの方とまったく同じです。

かつ、もしくは (and/or)

tableMapの方とまったく同じです。

補足コメント (期待値など)

tableMapの方とまったく同じです。

Example

シンプルなポリシーのExample

e.g. シンプルなポリシー @schemaPolicyMap.dfprop
map:{
    ...

    ; wholeMap = map:{
        ; themeList = list:{ uniqueTableAlias ; sameColumnAliasIfSameColumnName }
    }
    ; tableMap = map:{
        ; themeList = list:{ hasPK ; upperCaseBasis ; identityIfPureIDPK }
        ; statementList = list:{
            ; if tableName is $$ALL$$ then fkName is prefix:FK_$$table$$
        }
    }
    ; columnMap = map:{
        ; themeList = list:{ upperCaseBasis }
        ; statementList = list:{
            ; if columnName is suffix:_FLAG then bad
            ; if columnName is suffix:_FLG then notNull
            ; if columnName is suffix:_FLG then dbType is INTEGER
            ; if columnName is suffix:_FLG then classification
        }
    }
}

様々なポリシーのExample

e.g. 様々なポリシー @schemaPolicyMap.dfprop
map:{
    ...

    ; wholeMap = map:{
        ; themeList = list:{
            ; uniqueTableAlias
            ; sameColumnAliasIfSameColumnName
            ; sameColumnDbTypeIfSameColumnName
            ; sameColumnSizeIfSameColumnName
            ; sameColumnNameIfSameColumnAlias
        }
    }
    ; tableMap = map:{
        ; themeList = list:{
            ; hasPK
            ; hasAlias
            ; hasComment
            ; upperCaseBasis
            ; identityIfPureIDPK
        }
        ; statementList = list:{
            ; if tableName is $$ALL$$ then fkName is prefix:FK_$$table$$
            ; if tableName is $$ALL$$ then indexName is prefix:IX_$$table$$ or prefix:FK_$$table$$
        }
    }
    ; columnMap = map:{
        ; themeList = list:{ upperCaseBasis }
        ; statementList = list:{
            # CODE column
            ; if tableName is prefix:CLS_ and column is pk then classification => set classification dfprop

            # FLG column
            ; if columnName is suffix:_FLAG then bad
            ; if columnName is suffix:_FLG then notNull
            ; if columnName is suffix:_FLG then dbType is INTEGER
            ; if columnName is suffix:_FLG then classification
        }
    }
}

identityIfPureIDPK で除外テーブル

備え付けの theme は使わず、column.statement で細かく設定すればテーブル除外ありの identityIfPureIDPK を実現することができます。

e.g. identityIfPureIDPK をテーブル除外 @schemaPolicyMap.dfprop
map:{
    ...

    ; tableMap = map:{
        ; themeList = list:{
            # unused here, see check it by column.statement to except specified tables 
            #; identityIfPureIDPK
        }
        ; statementList = list:{
            ...
        }
    }
    ; columnMap = map:{
        ; themeList = list:{ upperCaseBasis }
        ; statementList = list:{
            # ID column
            ; if tableName is not prefix:MST_ and column is pk and columnName is suffix:_ID and column is not fk then identity => instead of identityIfPureIDPK

            ...
        }
    }
}