技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

人的ミスを考慮した手順の作成

システムを運用する上で、手作業での運用作業は避けられないものです。
例を挙げると、プログラムの不具合の対応でデータを補正する、自動的にデプロイできない特殊なプログラムをデプロイする、といった運用作業が発生します。
 
手作業での運用作業では、コマンドの打ち間違いによる人的ミスがつきものです。
人的ミスを減らすためには手順を作り込むことが大事ですが、その手順に従っていても単純な入力ミスは防ぎきれません。
そこで、入力ミスしたとしても、ミスによる影響をなるべく限定できるような手順にすることが大事です。
フールプルーフ的な考え方です)
 
-----------------------------
 
データベースに登録している商品について補正をかける例を挙げて具体的に見ていきます。
 
商品テーブルのレコードとして、主キーは「商品コード」、従属項目として「メーカーコード」「商品種別」があるとします。
ここで、「メーカー側の情報公開の誤りにより、メーカーコード"100"の一部商品について、商品種別が"e"から"c"に変えなければならない」という要件が急遽出てきて、手作業によるデータベースの補正が必要になったとします。
また、対象の商品コードは"100"と"101"であると補正手順上で事前に特定できたとします。
 
ここで、主キーである「商品コード」を特定したからといって、
 update 商品テーブル set 商品種別 = "c" where 商品コード in ("100","101");
というSQL文を発行するのは危険です。
このSQL文だと、商品コードの特定の誤りや商品コードを打ち間違いが発生した場合に、他メーカーの商品や他の商品種別の商品に影響を与えてしまう恐れがあります。
 
ここは、
 update 商品テーブル set 商品種別 = "c" where 商品コード in ("100","101") and メーカーコード = "100" and 商品種別 = "e";
というSQL文を発行する手順にした方が安全です。
対象商品は「商品コード in ("100","101")」で一意に特定しているので「メーカーコード = "100"」「商品種別 = "e"」という条件はあっても無くても更新結果は変わらないのですが、前述のような誤りが発生した時に「メーカーコード = "100"」かつ「商品種別 = "e"」の商品に影響を限定することができます。
 
-----------------------------
 
これは一例ですが、システム障害を減らす上では、「人間はどんなに気を付けていてもミスをするものだ」という前提に立った上で、ミスによる影響をなるべく限定するような策を講じることが大事です。