Quando um usuário deve executar um procedimento armazenado complexo, dentro do qual existem algumas tabelas / visualizações ou até outro procedimento armazenado.
Minha pergunta é:
Antes de o SQL Server gerar um plano de execução, ele verifica a permissão do usuário?
Caso contrário, gerar o plano de execução em si é um custo indireto desperdiçado se o usuário não tiver EXEC
permissão para esse procedimento armazenado em primeiro lugar.
Se sim, parece-me que não há nada consumível para o mecanismo do SQL Server, ou seja, não há identificador seguro (como o próprio procedimento armazenado, tabelas dentro do procedimento armazenado etc.) que o mecanismo do SQL Server pode usar para verificar a permissão do usuário . Todos esses identificadores protegíveis não serão gerados até que pelo menos a análise seja feita.
Então, de uma perspectiva de ciclo de vida da execução de um procedimento armazenado, quando a verificação de permissão do SQL Server é iniciada?
Isso é explicado em alguns detalhes aqui:
https://learn.microsoft.com/en-us/sql/relational-databases/security/permissions-database-engine
Mas a resposta básica é que os procedimentos armazenados têm planos de consulta armazenados em cache e reutilizados, e as verificações de permissões não são necessárias quando os objetos pertencentes ao proprietário do procedimento armazenado são acessados a partir de um procedimento armazenado. Se existirem cadeias de propriedade válidas entre o procedimento e o objeto a ser acessado, somente a permissão EXECUTE será verificada antes que o procedimento armazenado seja iniciado. Outras verificações de permissões são ignoradas.
A principal coisa a lembrar aqui é que todas as consultas em um lote são analisadas e compiladas antes que qualquer uma delas comece a ser executada. As permissões são verificadas durante a execução. E é até possível fazer referência a uma tabela em uma consulta de forma que as permissões nessa tabela nunca sejam realmente verificadas.
Se você assistir a uma sessão XE como esta:
E fazer algo como
Então:
Você verá que os planos de consulta no primeiro lote são compilados, então a primeira consulta é executada e a segunda falha. A terceira consulta é bem-sucedida sem uma verificação de permissões.