こんにちは!
中の人です
こちらにチラっと書きましたが一つのメモとして残したいと思います
なんでしょうか?
herokuって、私の古いイメージでは「無料でwebアプリを公開できる」というスーパーなwebサービス?のイメージがありましたが、salesforceに買収された関係で今やherokuといえばsalesforceっていうイメージです(ちなみに今はherokuは全て有料になってるはずです)
それで、salesforceの一部となった関係で、herokuのpostgresqlをsalesforceに連携できるようになったんですね
どんな連携かと言うと、自分知ってる限りですが、herokuのpostgresqlのフィールドをsalesforceのオブジェクトのフィールドに紐づけることができて、つまりはsalesforceのオブジェクトのフィールドと、herokuのpostgresqlのテーブルのフィールドをリンクできるんですね
その関係があるからか、herokuのpostgresqlにinsertやupdateやdeleteすると、タイトルにある
function get_xmlbinary() does not exist
function hstore(***) does not exist
のエラーが出て
「なんやねんこれぇぇぇぇ」
てなる方がいるんですね(私もその一人)
参考
この2種類のエラーがまとまってる記事がヒットしなかったのでまとめて記事に残してメモとして紹介しようということです
解決方法
SET search_path TO hogehuga, public, heroku_ext;
search_pathに、目的のtableがあるhogehugaと、publicとheroku_extを含めると解決します
get_xmlbinary()
この関数は"public"schemaにあります
hstore()
この関数は"heroku_ext"schemaにあります
どこでこの関数使ってんねん
まずherokuのpostgresqlの利用したいtableがあるschemaには
_trigger_log
なるテーブルが存在し、各テーブル(accountとか)には
_hc_lastop
_hc_err
なるフィールドが存在します
_trigger_log
で、herokuのpostgresqlでinsertやupdateすると、salesforceの情報も上書きするみたいなんですが、その時の記録をこのテーブルに保管するみたいです
参考
_hc_lastop _hc_err
で、このフィールドたちは
_hc_lastopフィールドは「今salesforceにinsert中ですよ」とか「ssalesforceと連携完了したよ」なステータスが保存されるみたいです
_hc_errフィールドは、salesforceとの連携に失敗した時、そのエラー内容が登録されるみたいです
参考
つまり
updateやinsertするときに、上記のテーブルやフィールドを更新する関数がtriggerされるのですが、
_hc_lastopや_hc_errを更新する関数(多分hc_hogehuga_statusのような名前の関数?)の中に
get_xmlbinary
が使われてて
_trigger_logを更新する関数(多分hc_hogehuga_loggerのような名前の関数?)に
hstore
が利用されていました
気になる方はご自身のpostgresqlの中身を覗いてみてください!
終わりに
herokuのpostgresqlのschemaの...てパルスのファルシのルシがコクーンでパージみたいで簡単に言い表せないかな
\(^o^)/オワリ!