Can I change a contribution's values for Financial Type and Campaign directly in SQL without danger?
If you're not using the in core CiviAccounts bits - then changing the financial_type_id is ok. We do lots of retyping (update more specific financial_type_ids ad-hoc) - on projects where we do our own Accounting integration i.e. bypassing the core CiviAccounts.

PS - forgot to note that updating campaign_id should be safe