Changing application languages or different application languages with 1 DB is a point for me.. For example we have projects in Python and in .NET, but they use same database. Also we have almost 30 services in scope of 1 business project, many of which use the same DB. So we have to write Business logic layers in different languages and also maintain several such projects and reference them into other projects or write stored procedures for all the projects at once in 1 place. I really see Tom's point too, procedures are more difficult to read and maintain; yes, you can add versioning, but then you have to maintain some SQL files with logic behind naming them or smth. Another my point against BL in application layers: I worked a lot in the finance sector and the security requirements there are high. The easiest option to manage security concerns was: creating users with certain permissions on executing procedures/other things right in the DB: so we have just one place to manage permissions across all our services, also anyone who gains access to one of our servers (sure they are secured, but IF...) can gain access to only certain DB user with certain permissions ONLY, so he can access only subset amount of data/procedures.