Por que não há função de banco de dados interno "Stored Procedure Executor"?
-
27-09-2019 - |
Pergunta
Eu sempre me perguntei por que a lista de funções de banco de dados (db_datareader
, db_datawriter
, db_ddladmin
, etc) nunca incluiu um db_storedprocedureexecutor
. Os outros fazem sentido, mas parece que poder conceder a capacidade de executar todos os procs armazenados para um usuário em particular (sem conceder -lhes db_owner
, que é a única outra maneira de realizar a mesma coisa) seria uma coisa útil.
Por exemplo, digamos, quero dar a todos os meus desenvolvedores os direitos de executar procedimentos armazenados, embora não os permitirem executar nenhum DDL - sem conceder explicitamente a execução em todos os procedimentos armazenados (e depois lembrando de adicionar os novos quando SPs adicionais forem implantados) , não há maneira de fazer isso (eu sei que o SPS pode conter o DDL, para que eles ainda possam ter acesso indiretamente ao DDL dessa maneira).
Se eu tiver uma conta de serviço de aplicativo e vários procedimentos armazenados que acompanham meu aplicativo, tenho que conceder direitos explicitamente a todos os SP (já que não quero conceder minha conta de serviço de aplicativo DBO), enquanto posso usar um papel para permitir que eles atualizem/excluam o que quiserem.
Embora inicialmente pareça óbvio, agora não sei por que essa função está faltando no servidor de banco de dados - alguém pode oferecer uma explicação de por que essa é uma idéia terrível (como presumo que seja, ou já existiria)?
EDITAR:
Parece que não sou o único com essa expectativa - e Está contornado com um punhado de T-SQL (Parece que você pode conceder uma execução correta correta, o que eu não sabia que você poderia fazer), o que me deixa me perguntando por que não é padrão!
Solução
Se você usa esquemas, então você só precisa GRANT EXECUTE ON SCHEMA::storedprocschema
por exemplo CREATE PROC storedprocschema.DoStuff ...
Quanto ao porquê, sem ideia ...
Outras dicas
Porque se você puder executar todos os procedimentos armazenados, poderá executar sp_addrolemember
, e você pode fazer tudo o que um database_owner
posso.