毎度のごとく12/23は、かしゆかの誕生日です。お祝いです。おめでとうございます。
ネタとしてはホント甚だしいというか、ホントにPlatform Specialistなのかという話ではありますが、今更ながら「Apex一括処理」ってすごくないですか。やばいと思うんですよ。ちょっと失敗したら、データがこんな事になってしまうんだって、実行してから気がついてしまう。しかも復旧はほぼ不可能。
物理的なデータ破壊に関しては物理的なバックアップから時間をかければ読み戻せますが、論理的なデータの破壊って管理者の一撃でどうにでもなるんですよね。これはやばい。論理バックアップを取っていたとしても、どこで壊れて、どこまで戻そうかと買って容易じゃないです。物理的に壊れたときはそこで全てが停止して、ある地点まで戻ってしまいますが、どこからどこまでのデータが行方不明になっているかはわかります。諦めが付きます。論理的に停止した場合、業務が止まっていなかったら、その後もデータの更新が継続されます。気がついたときには、わけのわからないデータ状況になっていることもしばしばです。データを通常の行為で、強制的に変更ができる仕組み、それも大量のデータを。この恐怖をみなさまにも、1つ思い出していただきたく、コードを準備しました。
Apex一括処理で誕生日を全部変更する
世界が平和になるには、世界がみんなPerfumeだったらという思想のもと、システム管理者が正義の鉄槌として、登録されているすべての取引先責任者の誕生日を、かしゆかの誕生日にしたら世界平和が訪れるのではないかと考えることは、ママあることでしょう。
試してみます。
global class ChangeBirthday2Kashiyuka implements
Database.Batchable<sObject>, Database.Stateful {
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator('SELECT Id, Birthdate FROM Contact');
}
global void execute(Database.BatchableContext bc, List<Contact> records){
for (Contact contact : records) {
contact.Birthdate = Date.newInstance(1988, 12, 23);
}
update records;
}
global void finish(Database.BatchableContext bc){
// execute any post-processing operations
}
}
なんてことのないApex一括処理の基本的な形・構成です。Apex
では、Date型をテキストで表現するいわれがないので、Date型
をいちいち呼び出してあげないようなところが、厳密だなってちょっと感じます。今回のキモはここですね。これ contact.Birthdate = Date.newInstance(1988, 12, 23);
過去最高に素敵なコードに見えます。
おもむろに、開発コンソールで ^E
別名 Ctrl+E
を押して、次のコードをコピペして、「Execute」すると、登録されている取引先責任者が、一件だろうが数万件だろうが、これですべて「かしゆかの誕生日」に変わります。
ChangeBirthday2Kashiyuka myBatchObject = new ChangeBirthday2Kashiyuka();
Id batchId = Database.executeBatch(myBatchObject);
まとめ
Apex一括処理、たったのこれだけのコードである程度の業務を停止することができていしまいます。されど誕生日。これがまだ誕生日なので、あとでいくらでもリカバリできる可能性がありますが、全員同じ名前になったとしたらどうでしょう。恐いですね。
おかげさまで、私の一番古くからある開発環境の取引先責任者が、すべてかしゆかの誕生日になりました。このような現象を引き起こすのは私だけで十分だと思います。みなさまも、「Apex一括処理」はドライランとテストを何度も試してから、気をつけて実行ください。