I'm seeing errors in my
_trigger_log where the
invalid cross reference id. What does this mean and how do I fix it?
You get the
invalid cross reference id error when Heroku Connect attempts to insert or update a row in Salesforce that has a field value which references another Salesforce record that either doesn't exist, or isn't accessible by the API user.
You can get more details about what Heroku Connect attempting to write by querying the
_trigger_log table and inspecting the
SELECT values FROM salesforce._trigger_log WHERE table_name = 'my_table__c' AND state != 'SUCCESS' ORDER BY id;
In the query results, look for fields that reference other records by their Salesforce ID, such as
If the referenced record is something that can be viewed in the Salesforce UI, such as a User or an Account, you can verify whether or not your Salesforce integration user can access the record by:
- Logging in to your Salesforce org as the Salesforce integration user (that is, the user that you authorized Heroku Connect to sync data to Salesforce with).
- Attempting to view the record. You can usually do this by visiting a URL that's composed of your base Salesforce URL and the record ID. For example, if your base Salesforce URL is https://na64.salesforce.com and your record ID is
00124000001sJP2AAM, try to access https://na64.salesforce.com/00124000001sJP2AAM. If you're unable to view the record while logged in as the Salesforce integration user, you've identified the problem: you're referring to a record that either doesn't exist or isn't accessible by your user. You may need to update object or record-level permissions. If you can successfully view the record, more investigation will be required.
You can also verify that you're writing exactly the columns to Salesforce that you expect. An example query of how to check this is:
SELECT id, record_id, sf_message, ARRAY( SELECT key FROM each(values::hstore) WHERE value IS NOT NULL AND key != 'id' ) FROM salesforce._trigger_log_archive WHERE action = 'INSERT' AND table_name = 'opportunity' AND state = 'FAILED' AND processed_at >= '2018-07-13'::date;
In some cases, this query may help identify a subset of fields that may be more likely to be successful. Following that you can follow our documentation to resolve write errors