Solução
A aplicação de db_datareader e db_datawriter não é suficiente, pois nenhum deles recebe a execução correta do procedimento armazenado. Você deve conceder permissão de execução para cada procedimento armazenado em seu banco de dados ou ... Bastante tedioso.
Se o seu banco de dados for o SQL Server 2005 ou posterior (o meu é o SQL Server 2008 R2, então estou coberto), você pode fazer isso com muito menos esforço:
-
crie uma nova função de banco de dados chamada db_executor
create role db_executor
-
concede direitos de execução de procedimento armazenado para todos os procedimentos armazenados no banco de dados
grant execute to db_executor
Se você quiser conceder direitos de execução apenas a procedimentos armazenados específicos do esquema, esta última chamada deverá ser executada como (ajuste do nome do esquema - dbo - conforme necessário):
grant execute on schema::dbo to db_executor
E é isso. Então tudo o que você precisa fazer é configurar seu usuário (ou no meu caso, era um grupo) para ser membro dessa função e as coisas funcionam como esperado.