In the development environment in which I am working, We have three company's doing parallel development on web apps (modules) for one web site. While in many cases these modules implement a database comprised of data that only they use, there are several databases which provide shared data. These developers have no access to servers that can be shared with the developers from the other companies until the application is ready to be deployed on the government test server for beta testing. In addition, one of the companies has their developers working from home in another country so they don't even have access to a server that they can share the other developers in their company.
Having a defined application interface is a nice idea, but it would require centralized coordination, which here doesn't exist until the application is delivered. We have instructed that all data reads and updates are to be performed via stored procedures so to lessen the impact of the change in the data required by one application on the others sharing the data. However, there are problems when there is a need to add fields or change data types of the fields in the actual tables. We had that problem recently when the application that made primary usage of the table need to change the datatype of a field which then broke all of the reports that were accessing data from that table.
Sometime you just have to do what you can.