but then I got to wondering if simply putting code in the ON UPDATE trigger to send the old record to a "history" table would be a more complete (and long term EASIER) solution, whereby my app would query the "history" table for changes.
I have a custom add-on to our core product that does exactly this.
It adds a new table to hold the audit log of changes. It also adds several other metadata tables which store details of which tables and fields are to be audited. You can nominate a table, field and whether you want to track one or more of insert, update and deletes. The database schema is updated based on this to add the relevant insert\update\delete triggers on the tables. The triggers call a stored procedure which updates the audit table based on the old and current values of the relevant fields.