Estou faltando alguma coisa ao tentar usar o meu procedimento armazenado EXECUTE AS
. O procedimento armazenado está lendo dados source_db
, agrega-os e armazena o resultado target_db
.
O SP está em target_db
. Eu tenho um login dedicado e mapeio-o para usuários do proprietário source_db
e target_db
do sp (para que exista um usuário app_agent
dentro source_db
e dentro target_db
do login app_agent
).
Se eu app_agent
efetuar login como e executar
EXEC target_db.app_agent_schema.import_data
tudo funciona bem. Mas se eu mudar
ALTER PROCEDURE app_agent_schema.import_data WITH EXECUTE AS OWNER` (or `AS SELF`)
e tente executá-lo, ele lança
O principal do servidor "app_agent" não pode acessar o banco de dados "source_db" no contexto de segurança atual.
Estou usando o SQL Server 2008.
Alguém poderia apontar o meu erro?
obrigado
Atualizar
Depois de fazer algumas pesquisas, descobri que ALTER DATABASE target_db SET TRUSTWORTHY ON
resolve o problema, mas isso não parece a solução certa para mim ...
fonte
Respostas:
Isso é explicado em Estendendo a representação do banco de dados usando EXECUTE AS . O contexto EXECUTE AS é confiável apenas no banco de dados atual e permitir que ele se espalhe para outros bancos de dados é uma escalada do vetor de ataque de privilégio.
Existem duas soluções, ambas descritas no artigo vinculado acima:
o mais fácil é para marcar o TRUSTWORTHY banco de dados:
ALTER DATABASE [source_db] SET TRUSTWORTHY ON;
. Apesar de fácil, é também perigoso, pois faz odbo
desource_db
um de-factosysadmin
.o mais seguro é usar assinatura de código, consulte Chamar um procedimento em outro banco de dados, por exemplo. Isso é mais complexo, mas é 100% de segurança contra descargas.
fonte
Qual usuário executa o comando ALTER PROCEDURE? Pode ter definido o nível de acesso do proprietário para esse usuário, não o que você pretendia.
fonte
app_agent
). Se eu tiver um procedimento criado porapp_agent
semexecute as owner/self
, efetue login comoapp_agent
, o SP será executado corretamente. Se eu adicionarEXECUTE AS SELF
(novamente, o mesmo usuário), e entrar, mesmo quandoapp_agent
, recebo...is not able to access the database...