SalesForceには、各オブジェクトに「作成者」、「作成日」、「最終更新日」、「最終更新者」という監査項目が存在します。
これらの項目は、基本的には任意の値を設定することはできないのですが、実は組織の設定を変更することで作成時のみ任意の値を設定することができます。
デフォルトの組織の設定時の動作確認
まずは組織で監査項目の設定を許可していない場合の動作を確認してみます。
標準のページレイアウト上
標準のページレイアウト上では編集ができません。(鉛筆マークが出ていない)
匿名ブロックから実行
匿名ブロックから画像のように作成者を設定する処理を実行すると、エラーとなります。
Apexクラス・Apexトリガー
クラスもトリガーもコンパイルエラーとなり、保存できません。
設定の変更
監査項目を設定できるように、組織の設定を変更しましょう。
[設定] > [ユーザインターフェース] と進むと、[設定セクション]に
「「レコードの作成時に監査項目を設定」および「無効な所有者のレコードを更新」ユーザ権限を有効化 」というチェックボックスがあります。
こちらにチェックをつけると、監査項目に値を設定できます。
設定変更後の動作確認
設定の変更後も実は、ページレイアウト上から編集はできません。
匿名ブロックからの実行もエラーとなります。
これはユーザ(プロファイル)に監査項目の設定権限がないためです。
また、監査項目はレコード作成時のみ設定でき、作成後編集は出来ないためです。
ただし、先ほどのApexクラスとApexトリガーは、
コンパイルエラーとならずに保存できます。
また、その保存したApexクラスのメソッドを匿名ブロックから実行すると、
監査項目が設定できます。
まとめ
普通は値をいじれない監査項目を、組織のユーザインターフェース設定を変更することで、監査項目に任意の値を設定することが出来ました。
注意点としては
・レコード作成時のみ値を設定できる
・権限のないユーザは設定できない
・権限のないユーザでも、Apexクラス内のメソッドを呼び出す形で、匿名ブロックから任意の値を設定できる
・Apexトリガーも同様の動作となる
という点です。
監査項目は出来ればいじらない方がいいみたいですが、どうしても任意の値を設定したい要件があった際に役立てていただければ幸いです。
また、ここまでは調べればいくらか情報が出てきますが、
トリガーのbeforeとafterでどう違う動作となるのか、どういう要件でこのような処理を行う必要があるかなどについて、また投稿したいと思います。