Sanitizing data on the lowest level usually means doing some referential integrity and primary and foreign key job. This has to be done in the stored procedures (so that stored procedures should know that value from sequence/generator A_seq should be put into primary key of table A, and this should be also put into A_id into table B, etc). There can be for example some stored procedure entitled SavePurchaseHead, SavePurchaseDetails, GetSegmentForCustomer, GetCustomerBalance, GetOverdueLevelForSegment, etc. This is done mostly to hide logic of INSERT, UPDATE or JOIN sql instructions inside database.
Now imagine where you will want to put some business knowledge, like “customer overdue 5000 USD cannot make a new purchase until he pays with cash”? Stored procedures are usually bad idea for such calculations – the better solution is to have some business service like MakeNewPurchase, that will take customer data and purchase data, and do business stuff. This service may probably start with getting information about customer segment, than get customer balance and compare it with this segment overdue level. If everything will be ok, procedures like SavePurchaseHead and SavePurchaseDetails will be executed.
So you will have some levels of knowledge: client applications will know only that making purchase requires you to call service MakeNewPurchase. They will talk in “business language”. Plus – important changes to business logic will have to be made only in one place (business logic layer) instead of FIVE apps. Than business logic layer will know how the business is made, but will lack knowledge about how UI is composed and will lack knowledge about how exactly data is stored and optimized. Database will have only knowledge about data and how it is stored. This will divide responsibilities between all layers, and while working I multi developers team it will help you to maintain some order, through tiny interfaces. And – as mentioned before – one application won’t hurt other by “breaking” the data.
Two last things – when I say “service-oriented middleware” I do not mean any hype. As I wrote before – SELECT and UPDATE should be on DB level. “Middleware” or “Business layer” (no matter how you will call this) should be on more business oriented terms. Actually, web services and WCF are just a tools. No matter how you will do it –it can be done with WCF, J2EE, PHP, WS-*, Borland Delphi or even pure C. Which technology you will use is a consideration of available developer workforce, learning curve of technology, scalability and your other needs. But I think it has to be done via some network, and that business layer should be located close to database.
I hope this covers also your last consideration about the need to do something with your five apps if DB changes. Look – the need to change DB should come from the business need. If you need to store some additional information – you will have redesign it’s business service, and probably add some fields to DB. You will have to alter database and your business service. There is a big chance you will not have to modify your five apps, if you design business layer smartly. For example, imagine you will want to calculate customer scoring and use it internally to calculate good offer for your best customers – in such case you will most probably add one field to DB and alter some services (add service to calculate scoring and alter offer calculation service) without any need to change GUI. However, if one day you will jump into conclusion that customer name and address is too little, and you want to gather all his educational, healthy, family, marriage, criminal and credit record – you will need not only to change DB, but to change business layer and provide users of your five applications with dozen of new input screens to collect such data…