RECAPITAR EM OUTRAS RESPOSTAS
Aqui está um rápido resumo do que os outros disseram aqui antes.
Política profissional da empresa:
- Permite rastrear dependências entre objetos de banco de dados e ter uma visão geral de como as mudanças planejadas afetam o esquema;
- A equipe do DBA pode revisar e controlar os direitos de acesso ao aplicativo;
- A equipe do DBA é capaz de prever o impacto no desempenho das mudanças;
- Desacopla o banco de dados do código do aplicativo;
- Teoria da janela quebrada ... significa que é assim que eles organizam seu código e a quebra da consistência dificulta a compreensão da infraestrutura para os recém-chegados, o que os faz respeitar e se esforçar para obter menos qualidade;
- Você recebe seu salário para fazer o que foi solicitado. Esta é uma política da empresa e, no momento, você não tem autoridade para alterá-la, portanto é melhor conviver com ela.
Contra a política da empresa:
- Essa mentalidade da empresa é muito rígida e dogmática, e a política torna o trabalho do desenvolvedor desnecessariamente pesado. Infelizmente, veja o último ponto na seção Pros;
- Como o back2dos se refere a ele dizendo "Para todas as consultas feitas no banco de dados, é necessário procurar o procedimento armazenado" , uma política somente sprocs geralmente resulta em duplicação de código, porque diferentes desenvolvedores não têm idéia de quais sprocs poderiam ser reutilizados para seus problema em questão;
- Além disso, ironicamente, o contrário do caso anterior também cria problemas, quando um aplicativo é dono de um sproc, depois outro o reutiliza; o primeiro o atualiza sem o conhecimento de quem mais começou a confiar nele. Os DBAs rastreiam as dependências não além das paredes da sala do servidor de banco de dados, portanto, não espere que eles dêem a mínima para que aplicativo se baseie em que fora disso. Se as equipes de aplicativos não acompanharem o problema entre si, os DBAs serão cobertos.
AQUELES 2 CENTROS
Primeiramente, muitas respostas aqui usam a palavra padrão . A prática de proibir consultas diretas e apenas permitir sprocs não é chamada de padrão. É uma política (veja a resposta do jzd ).
Em segundo lugar, específico para o seu problema: meu principal contra-argumento contra uma política tão restritiva de usar procedimentos armazenados exclusivamente seria a própria linguagem SQL , e não necessariamente a infraestrutura centralizada de repositório de lógica de negócios que ela promove (embora isso também tenha contra-argumentos) .
O SQL é uma linguagem bastante rígida e não compostável, com poder expressivo bastante limitado . Isso significa que você atingirá um beco sem saída muito cedo no que diz respeito à reutilização do código . Uma das razões dessa rigidez é que não há meios de passar funções de primeira classe de maneira alguma (como nas linguagens OOP usando polimorfismo), o que limita significativamente a composição . O mais próximo que você pode chegar disso em poder expressivo é escrever consultas SQL dinâmicas construídas usando concatenação de cadeias. Não é uma coisa legal. As consultas dinâmicas anulam alguns dos pontos da seção "profissionais", como as dependências de rastreamento entre objetos do banco de dados, e geralmente apresentam desempenho pior, propenso a erros, difíceis de depurar e aumentam orisco de ataques de injeção de SQL . Infelizmente, com o SQL, você descobrirá que não pode ir muito longe extraindo lógica reutilizável comum entre sprocs sem bater no muro e ser forçado a recorrer a consultas executadas dinamicamente.
UPDATE: Outra grande limitação dos procedimentos armazenados, além da função de primeira classe, é a passagem e o retorno de tipos de dados compostos como argumentos, sejam listas, conjuntos, registros ou pares de valores-chave. Isso também prejudica a composição.
Finalmente, eu não concordo necessariamente com um dos pro pontos acima, a "dissociação DB da aplicação" por Jorge : O principal princípio que eu sinto se aplica aqui é preferir estruturas de dados primitivos com grande conjunto de reutilizável comum e operações combináveis, em vez de trabalhar com APIs personalizadas . Sprocs são essas APIs personalizadas aqui, que ficam entre o usuário e os dados relacionais primitivos para consultá-lo usando primitivas comuns de manipulação de dados composíveis ( selecione, junte-se, onde, agrupe poretc). Agora, o próprio SQL não é a escolha ideal para ser o DSL para primitivas de manipulação de dados composíveis, devido à rigidez mencionada acima, mas com uma opção de linguagem mais sensata (como .NET Linq ... ou Lisp / Clojure!), Você pode executar seu lógica em uma lista simples da mesma maneira que em um resultado de banco de dados DB. Obviamente, isso o torna facilmente testável, o que é uma coisa boa. Eu digo que prefiro que seu armazenamento de dados seja burro, simples e primitivo, de modo que possa ser removido com CSVs simples. Como você vê, esse modelo também desacopla o banco de dados do aplicativo, apenas desenha a linha em um nível mais baixo de abstração.
O QUE FAZER A SEGUIR?
É um pouco não relacionado à questão, mas encorajo você a dar uma olhada no Datomic , que tem uma abordagem interessante para armazenar e consultar dados, de acordo com algumas das observações acima. (Obviamente, quero dizer, observe-o estritamente fora do ambiente de trabalho primeiro ... definitivamente NÃO vá ao escritório do CTO no dia seguinte e diga "Ei, pessoal, eu reescrevi alguns de seus sprocs no Datomic e o implantei nesse brilhante servidor de prod. lá, é muito legal dar uma olhada! " Eles podem não apreciar a emoção completamente compreensível;)