MSSQLSERVERについて
皆さん、おはようございます。
既存システムのデータベースをPervasiveからMSSQLSERVERへ変更を考えています。
その際、注意する事などあれば教えて下さい。
よろしくお願いします。
-
日付項目は YYYYMMDD のTEXT形式にした方が後々やりやすいです。
特にゼロ値が存在するような項目では。
日付形式ではゼロ値を設定するとエラーになったと思います。
テキスト形式で有ればスペース又はALLゼロにしとけば良いですから。
SQLQuery文を自分で記述するような場合、日付形式では変換しないと範囲チェックできないですから。数値項目は N#11C みたいにモデル辞書で定義していて、データの方はモデルNoでそのまま定義すると
思うのですが、モデル辞書では「記憶形式」を定義しないので忘れがちですが、データの方では
記憶形式が設定されます。
記憶形式=signed integer で 桁数=4 の場合、記憶できる値の範囲は -2,147,483,648 から 2,147,483,647 に
なります。この範囲外の値が集計値でセットされ際に集計が会わなくなり、原因を突き止めるのに
苦労したことがあります。
注意点としてはこれぐらいでしょうか。 -
Pervasiveで作成したシステムはトランザクションを意識してプログラムを作成していないと思います。
しかしMSSQLSERVERやORACLE等のデータベースはトランザクションが重要になります。
・不用意に大きくトランザクションをかけるとデータをロックしたままになり、同時に操作している他のユーザはロック解除待ちで不要に待たされる事になります。
・逆にトランザクションを小さくすると、障害発生時に処理の中の一部のみがロールバックされ一貫性のない状態になります
・トランザクションの中での各テーブルの更新順、テーブルの中の更新順を全ての処理で一致させないとデッドロックの要因になります。
単純にデータを切り替えるだけで、ほぼ元通りの動作にはなりますが、トランザクションを意識していないと複数ユーザで同時に使用する場合に運用に耐えられない状態になる可能性があります。
-
Ace_Nagashima さん、E_y さんご返信有難うございます。日付、数値項目の設定を変更しようと思います。トランザクションは、ISAMトランザクションをYで作成していますがやはり見直した方がいいのでしょうか?よろしくお願いします。
-
クライアント5台以内のユーザー環境ばかりなので基本的にはトランザクションは使用せずに
物理+レコードロックでやってます。伝票入力系のオンラインタスクはレコードロック方式でメモリーテーブルでのワークファイルに書き込んで
1枚の伝票入力が終わると更新用バッチプログラムをCALLしてマスターや伝票ファイルを更新するようにしてます。
この更新用バッチプログラムでは短時間に終わるのでトランザクションを使ってます。伝票入力系オンラインタスクでトランザクションを使ったらデッドロックが多発ししてしまい、
ワークへの入力+バッチプログラム方式に統一しています。トランザクションへの理解不足のせいもあるのでしょうが、簡単に済ませるために今の方式にしています。
-
PervasiveでISAMトランザクションをYで作成しているのですね。
(過去にページロック問題でドハマリした事があります)
この設定であれば既にトランザクションを考慮しているハズですので、おおよそ問題無いと思います。
あとは移行後のプログラムで確認して問題があれば対策していけばよいのではと思います。
-
Ace_Nagashima さん、E_y さん作業を進めようと思います。有難うございました。
サインインしてコメントを残してください。
コメント
6件のコメント