Just looking at some unanswered questions and came across you one...
So yes this can be a bit of a headache...our solution for this was to write some custom script which allows us to have a single "Template" model and then (using our app), roll this out to all the different client sites, where the app switches the database connection string (to that sites client) and triggers a refresh...however this does require server (...and it took, our genius, developer 3-4 months to fully write and test this!...and needs tweaks every server release)
On DeskTop (and viewer), would you be able to use the USERNAME() function? This would mean you'd need the name of each user (as Tableau understands it), and what "client" they could see, which would be brought in as a column in the view. You could then create a field [Database User] = USERNAME(), add that to the filter shelf (or make it a datasource/context filter). This should mean when the user opens the file it will only show them their data. There are, of course some security flaws to this...if a user had a full Desktop licence they could remove that filter and see everyone else's data.
Hope that helps.