Suponha que haja um certificado criado no banco de dados
create certificate certName
with subject = 'subj';
GO
E um usuário mapeado para este certificado
create user userName
from certificate certName;
GO
Tentando representar este usuário diretamente
execute as user = 'userName';
GO
ou especificando o usuário na execute as
cláusula do módulo
create procedure procName
with execute as 'userName'
as
set nocount on;
GO
retorna erro
Msg 15517, Nível 16, Estado 1...
Não é possível executar como principal do banco de dados porque o principal "userName" não existe, esse tipo de principal não pode ser representado ou você não tem permissão.
No entanto, não consegui encontrar essa restrição mencionada na documentação ( aqui e aqui ), onde a única declaração relevante parece ser
user_name deve existir no banco de dados atual e deve ser uma conta singleton. user_name não pode ser um grupo, função, certificado, chave ou conta integrada, como NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService ou NT AUTHORITY\LocalSystem.
É possível representar o usuário (ou login) mapeado para o certificado ou não?
Logins e usuários criados a partir de certificados e chaves assimétricas não podem ser representados. Eles são apenas proxies para um conjunto de permissões que serão adicionadas a qualquer módulo que seja assinado com o mesmo Certificado ou Chave Assimétrica.
Além disso, não faz muito sentido representar esses Logins e Usuários porque:
EXECUTE AS
cláusula opcional daCREATE
instrução) é usado para criar a assinatura. Se o texto mudar, a assinatura não corresponderá.No final, o uso de Logins e/ou Usuários criados a partir de Chaves Assimétricas e Certificados substitui a necessidade de Representação.
Ainda assim, se estiver procurando por um indicador mais oficial, a página do MSDN para CREATE USER declara:
No entanto, não poder fazer login/autenticar não significa "não pode representar", uma vez que os usuários sem login estão nessa lista e você pode fazer isso
EXECUTE AS USER='{user_without_login}';
.A página do MSDN para CREATE LOGIN afirma:
Enquanto a segunda frase repete o que a
CREATE USER
documentação diz, a primeira frase é um pouco mais específica: são apenas para assinatura de código.Por fim, a declaração de restrições que você encontrou na documentação de EXECUTE AS e da cláusula EXECUTE AS está correta, embora tenham sido redigidas de maneira confusa. Eles declaram (ênfase em negrito adicionada):
Essa citação foi retirada da
EXECUTE AS
documentação, e aEXECUTE AS Clause
documentação (quase a mesma redação) é citada na pergunta. Embora ambas as páginas usem os termos "certificado" e "chave", elas realmente significam "Login/Usuário baseado em certificado" e "Login/Usuário baseado em chave assimétrica", respectivamente. Estou assumindo isso com base no fato de que a lista de tipos principais fornecidos é encontrada emsys.server_principals
(para logins) esys.database_principals
(para usuários), e nem os certificados nem as chaves assimétricas seriam listados em nenhuma dessas exibições de catálogo do sistema.