1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Salesforce PlatformAdvent Calendar 2018

Day 23

Apex一括処理で、取引先責任者を全部かしゆかにする

Last updated at Posted at 2018-12-22

毎度のごとく12/23は、かしゆかの誕生日です。お祝いです。おめでとうございます。

ネタとしてはホント甚だしいというか、ホントにPlatform Specialistなのかという話ではありますが、今更ながら「Apex一括処理」ってすごくないですか。やばいと思うんですよ。ちょっと失敗したら、データがこんな事になってしまうんだって、実行してから気がついてしまう。しかも復旧はほぼ不可能。

物理的なデータ破壊に関しては物理的なバックアップから時間をかければ読み戻せますが、論理的なデータの破壊って管理者の一撃でどうにでもなるんですよね。これはやばい。論理バックアップを取っていたとしても、どこで壊れて、どこまで戻そうかと買って容易じゃないです。物理的に壊れたときはそこで全てが停止して、ある地点まで戻ってしまいますが、どこからどこまでのデータが行方不明になっているかはわかります。諦めが付きます。論理的に停止した場合、業務が止まっていなかったら、その後もデータの更新が継続されます。気がついたときには、わけのわからないデータ状況になっていることもしばしばです。データを通常の行為で、強制的に変更ができる仕組み、それも大量のデータを。この恐怖をみなさまにも、1つ思い出していただきたく、コードを準備しました。

Apex一括処理で誕生日を全部変更する

世界が平和になるには、世界がみんなPerfumeだったらという思想のもと、システム管理者が正義の鉄槌として、登録されているすべての取引先責任者の誕生日を、かしゆかの誕生日にしたら世界平和が訪れるのではないかと考えることは、ママあることでしょう。

試してみます。

ChangeBirthday2Kashiyuka.apxc
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」すると、登録されている取引先責任者が、一件だろうが数万件だろうが、これですべて「かしゆかの誕生日」に変わります。

anonymous
ChangeBirthday2Kashiyuka myBatchObject = new ChangeBirthday2Kashiyuka(); 
Id batchId = Database.executeBatch(myBatchObject);

まとめ

Apex一括処理、たったのこれだけのコードである程度の業務を停止することができていしまいます。されど誕生日。これがまだ誕生日なので、あとでいくらでもリカバリできる可能性がありますが、全員同じ名前になったとしたらどうでしょう。恐いですね。

おかげさまで、私の一番古くからある開発環境の取引先責任者が、すべてかしゆかの誕生日になりました。このような現象を引き起こすのは私だけで十分だと思います。みなさまも、「Apex一括処理」はドライランとテストを何度も試してから、気をつけて実行ください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?