Algumas Observações
Os procedimentos armazenados fornecem reutilização de código e encapsulamento (dois pilares do desenvolvimento de software),
Somente se você usá-los corretamente no contexto em que eles devem ser usados. A mesma afirmação pode ser dita sobre funções (em programação estruturada) ou métodos (em programação orientada a objetos); no entanto, vemos funções 1K e objetos mega-burros.
Os artefatos não oferecem esses benefícios. O uso adequado desses artefatos é o que oferece esses benefícios.
segurança (você pode conceder / revogar permissões em um processo armazenado individual),
Sim. Este é um bom ponto e um dos principais motivos pelos quais eu gosto de procedimentos armazenados. Eles fornecem um controle de acesso de granularidade mais fina do que o que normalmente pode ser alcançado com apenas visualizações e contas de usuário.
protegê-lo contra ataques de injeção de SQL,
Isso não é específico para os SPs, pois você pode obter o mesmo nível de proteção com instruções SQL parametrizadas e limpeza de entrada. Eu usaria SPs além desses, no entanto, como questão de "segurança em profundidade" .
e também ajuda na velocidade (embora o DBA tenha dito que, começando no SQL Server 2008, mesmo as consultas regulares do SQL são compiladas se forem executadas o tempo suficiente).
Isso é altamente específico do fornecedor do banco de dados, mas em geral seu DBA está certo. As instruções SQL (estáticas ou parametrizadas) são compiladas. Os SPs ajudam se você deseja / precisa agregar e computar dados que não podem ser executados com instruções SQL simples, mas estão fortemente integrados ao SQL e não justificam a viagem de ida e volta ao servidor de aplicativos.
Um bom exemplo é consultar dados em um cursor (ou cursores) temporário a partir do qual executar outro SQL em si. Você pode fazer isso de forma programática no servidor de aplicativos ou salvar as várias viagens de ida e volta fazendo isso no banco de dados.
Esta não deve ser a norma, no entanto. Se você tiver muitos desses casos, isso é um sinal de design incorreto do banco de dados (ou você está obtendo dados de esquemas de banco de dados não tão compatíveis entre departamentos).
Estamos desenvolvendo um aplicativo complexo usando a metodologia de desenvolvimento de software Agile.
A agilidade tem a ver com processos de engenharia de software e gerenciamento de requisitos, e não com tecnologias.
Alguém pode pensar em boas razões pelas quais eles não gostariam de usar procs armazenados?
Pergunta errada
A pergunta está errada e equivale a perguntar "existem boas razões para não usar o GOTO"? Sou do lado de Niklaus Wirth mais do que de Dijkstra sobre esse assunto. Eu posso entender de onde veio o sentimento de Dijkstra, mas não acredito que seja 100% aplicável em todos os casos. Mesmo com procs loja e qualquer tecnologia.
Uma ferramenta é boa quando usada bem para a finalidade a que se destina e quando é a melhor ferramenta para a tarefa específica. Usá-lo de outra forma não é uma indicação de que a ferramenta está errada, mas que o usuário não sabe o que está fazendo.
A pergunta apropriada é "que tipo de padrões de uso de procedimento armazenado deve ser evitado". Ou "sob quais condições devo (ou não) usar procedimentos armazenados" . Procurar razões para não usar uma tecnologia é simplesmente colocar a culpa na ferramenta, em vez de colocar a responsabilidade da engenharia diretamente onde ela pertence - no engenheiro.
Em outras palavras, é uma cópia ou uma declaração de ignorância.
Meu palpite era que os DBAs não queriam manter esses procs armazenados, mas parece haver muitos negativos para justificar tal decisão de design.
O que eles estão fazendo então é projetar os resultados de suas más decisões de engenharia nas ferramentas que eles usaram mal.
O que fazer no seu caso?
Minha experiência é que, quando em Roma, faça como os romanos .
Não lute contra isso. Se as pessoas da sua empresa quiserem rotular os processos da loja como uma prática ruim, deixe-os. Entretanto, esteja ciente de que isso pode ser uma bandeira vermelha em suas práticas de engenharia.
A rotulagem típica de coisas como más práticas geralmente é feita em organizações com toneladas de programadores incompetentes. Ao incluir na lista negra certas coisas, a organização tenta limitar o dano infligido internamente por sua própria incompetência. Eu cago não.
Generalizações são a mãe de todos os erros. Dizer que procs armazenados (ou qualquer tipo de tecnologia) é uma prática ruim, isso é uma generalização. Generalizações são cop-outs para os incompetentes. Os engenheiros não trabalham com generalizações flagrantes. Eles fazem análises caso a caso, fazem trocas de análises e executam decisões e soluções de engenharia de acordo com os fatos em questão, no contexto em que devem resolver um problema.
Bons engenheiros não rotulam as coisas como más práticas de maneira generalizada. Eles analisam o problema, selecionam a ferramenta apropriada, fazem trocas. Em outras palavras, eles fazem engenharia.
Minha opinião sobre como não usá-los
Não coloque lógica complexa além da coleta de dados (e talvez algumas transformações) nelas. Não há problema em colocar alguma lógica de massagem de dados neles ou agregar o resultado de várias consultas com eles. Mas é isso aí. Qualquer coisa além disso se qualificaria como lógica de negócios que deveria residir em outro lugar.
Não os use como seu único mecanismo de defesa contra a injeção de SQL. Você as deixa lá , caso algo ruim as atinja , mas deve haver uma grande quantidade de lógica defensiva na frente delas - validação / depuração do lado do cliente, validação / depuração do lado do servidor, possivelmente transformação em tipos que fazem sentido na sua modelo de domínio e, finalmente, ser passado para instruções parametrizadas (que podem ser instruções SQL parametrizadas ou procs armazenados parametrizados).
Não faça dos bancos de dados o único local que contém os procedimentos da sua loja. Os procs da sua loja devem ser tratados da mesma maneira que você trata o código-fonte C # ou Java. Ou seja, a fonte controla a definição textual dos processos da sua loja. As pessoas dizem que os produtos da loja não podem ser controlados pela fonte - porcaria, eles simplesmente não sabem do que diabos estão falando.
Minha opinião sobre como / onde usá-los
Seu aplicativo requer dados que precisam ser transpostos ou agregados de várias consultas ou visualizações. Você pode descarregar isso do aplicativo para o banco de dados. Aqui você deve fazer uma análise de desempenho, pois a) os mecanismos de banco de dados são mais eficientes que os servidores de aplicativos para fazer essas coisas, mas b) os servidores de aplicativos são (às vezes) mais fáceis de escalar horizontalmente.
Controle de acesso de grão fino. Você não deseja que algum idiota execute junções cartesianas em seu banco de dados, mas também não pode proibir as pessoas de executar instruções SQL arbitrárias assim. Uma solução típica é permitir instruções SQL arbitrárias em ambientes de desenvolvimento e UAT, enquanto as proíbe em ambientes de systest e produção. Qualquer declaração que deve chegar ao systest ou à produção entra em um procedimento de armazenamento, revisado por código pelos desenvolvedores e pelo dbas.
Qualquer necessidade válida de executar uma instrução SQL que não esteja em um processo de armazenamento passa por um nome de usuário / conta e pool de conexão diferentes (com o uso altamente monitorado e desencorajado).
- Em sistemas como Oracle, você pode obter acesso ao LDAP ou criar links simbólicos para bancos de dados externos (por exemplo, chamar um processo de loja no banco de dados de um parceiro de negócios via vpn.) Maneira fácil de criar código espaguete, mas isso é verdade para todos os paradigmas de programação você tem requisitos específicos de negócios / ambiente para os quais esta é a única solução. Os procs da loja ajudam a encapsular essa maldade em um só lugar, perto dos dados e sem precisar passar para o servidor de aplicativos.
Se você executa isso no db como um processo de loja ou no servidor de aplicativos, depende da análise de trade-off que você, como engenheiro, precisa fazer. Ambas as opções devem ser analisadas e justificadas com algum tipo de análise. Indo de um jeito ou de outro, simplesmente acusando a outra alternativa como "má prática", isso é apenas uma bobagem de engenharia.
- Em situações em que você simplesmente não pode aumentar o servidor de aplicativos (ou seja, sem orçamento para novas instâncias de hardware ou nuvem), mas com bastante capacidade no back-end db (isso é mais típico que muitas pessoas desejam admitir), vale a pena para mover a lógica de negócios para armazenar procs. Não é bonito e pode levar a modelos de domínio anêmicos ... mas, novamente ... análise de trade-off, a coisa na qual a maioria dos hackers de software é péssima.
Se isso se torna uma solução permanente ou não, isso é específico para as restrições observadas naquele momento específico.
Espero que ajude.