「監視と修復」があなたにとって何を意味するのかは完全には明らかではありませんが、次のようになります。
データベース側をどの程度制御できますか?キャッシュは、データ型クラスのLogicalToODBCメソッドを使用してグローバルからODBCに変換するときに、データ型のコードを実行します。プロパティタイプを%Stringから独自のクラスAppropriatelyNamedStringに変更すると、そのメソッドをオーバーライドして自動的に切り捨てることができます。それがあなたがしたいことなら。%Library.CompiledClassクラスを使用して、プログラムですべての%Stringプロパティタイプを変更することができます。
キャッシュ内でコードを実行して、(ある程度理論上の)最大長を超えるプロパティを持つレコードを見つけることもできます。これには明らかに全表スキャンが必要です。そのコードをストアドプロシージャとして公開することも可能です。
繰り返しますが、あなたが何をしようとしているのか正確にはわかりませんが、それらはいくつかの選択肢です。彼らはおそらくあなたが望むよりもキャッシュ側に深く入る必要があります。
そもそも悪いデータを防ぐ限り、一般的な答えはありません。キャッシュを使用すると、プログラマーはオブジェクトやテーブルの定義をバイパスして、グローバルに直接書き込むことができます。その場合は、コードを直接修正する必要があります。
編集:これは不良データの検出に役立つ可能性のあるコードです。あなたが面白いことをしているならそれはうまくいかないかもしれませんが、それは私にとってはうまくいきました。メソッドやタグに分割したくなかったので、ちょっと醜いです。これはコマンドプロンプトから実行するためのものであるため、おそらく目的に合わせて変更する必要があります。
{
S ClassQuery=##CLASS(%ResultSet).%New("%Dictionary.ClassDefinition:SubclassOf")
I 'ClassQuery.Execute("%Library.Persistent") b q
While ClassQuery.Next(.sc) {
If $$$ISERR(sc) b Quit
S ClassName=ClassQuery.Data("Name")
I $E(ClassName)="%" continue
S OneClassQuery=##CLASS(%ResultSet).%New(ClassName_":Extent")
I '$IsObject(OneClassQuery) continue //may not exist
try {
I 'OneClassQuery.Execute() D OneClassQuery.Close() continue
}
catch
{
D OneClassQuery.Close()
continue
}
S PropertyQuery=##CLASS(%ResultSet).%New("%Dictionary.PropertyDefinition:Summary")
K Properties
s sc=PropertyQuery.Execute(ClassName) I 'sc D PropertyQuery.Close() continue
While PropertyQuery.Next()
{
s PropertyName=$G(PropertyQuery.Data("Name"))
S PropertyDefinition=""
S PropertyDefinition=##CLASS(%Dictionary.PropertyDefinition).%OpenId(ClassName_"||"_PropertyName)
I '$IsObject(PropertyDefinition) continue
I PropertyDefinition.Private continue
I PropertyDefinition.SqlFieldName=""
{
S Properties(PropertyName)=PropertyName
}
else
{
I PropertyName'="" S Properties(PropertyDefinition.SqlFieldName)=PropertyName
}
}
D PropertyQuery.Close()
I '$D(Properties) continue
While OneClassQuery.Next(.sc2) {
B:'sc2
S ID=OneClassQuery.Data("ID")
Set OneRowQuery=##class(%ResultSet).%New("%DynamicQuery:SQL")
S sc=OneRowQuery.Prepare("Select * FROM "_ClassName_" WHERE ID=?") continue:'sc
S sc=OneRowQuery.Execute(ID) continue:'sc
I 'OneRowQuery.Next() D OneRowQuery.Close() continue
S PropertyName=""
F S PropertyName=$O(Properties(PropertyName)) Q:PropertyName="" d
. S PropertyValue=$G(OneRowQuery.Data(PropertyName))
. I PropertyValue'="" D
.. S PropertyIsValid=$ZOBJClassMETHOD(ClassName,Properties(PropertyName)_"IsValid",PropertyValue)
.. I 'PropertyIsValid W !,ClassName,":",ID,":",PropertyName," has invalid value of "_PropertyValue
.. //I PropertyIsValid W !,ClassName,":",ID,":",PropertyName," has VALID value of "_PropertyValue
D OneRowQuery.Close()
}
D OneClassQuery.Close()
}
D ClassQuery.Close()
}