Eu tenho que presumir que não sou um DBA, mas tenho a necessidade de manter uma instância do SQL Server e tenho poucos problemas com o encadeamento de permissão de procedimento armazenado (espero que os termos estejam corretos).
Para explicar brevemente minhas necessidades, eu tenho um usuário que deve ter concessão apenas em um banco de dados que deve executar um procedimento armazenado (nesse banco de dados "concedido") que contém referência a um banco de dados externo (devo herdar um pouco de concessão)
Em detalhes, meu cenário é que eu tenho três DBs
- DB de configuração (deve ser lido por todos, mas nunca escrito por ninguém, exceto pelo usuário de configuração)
- Staging DB (deve ser lido/escrito pelo procedimento de preparação)
- DB final (deve ser lido/escrito pelo aplicativo)
Então eu tenho três usuários
- Usuário de configuração: usado para manter dados no banco de dados de configuração
- Usuário de teste: usado por muitos procedimentos de teste (procedimentos muito longos, podem levar horas) que colocam dados no banco de dados de teste
- Usuário Final : usado pelo aplicativo que leu os dados quando o procedimento de preparação terminou para implantar os dados no banco de dados de preparação e colocá-los de volta no banco de dados final. O usuário final pode acessar todos os bancos de dados (pelo menos para leitura)
Até aí tudo bem, o procedimento de staging faz seu trabalho e quando completo escreve um semáforo (para notificar que os dados estão prontos). Às vezes, o aplicativo (que usa o usuário final) verifica o semáforo e ingere todos os dados no banco de dados final.
Agora eu tenho que oferecer suporte a um procedimento de teste rápido e sob demanda (ainda preciso executar no Staging DB por outros motivos) que, quando concluído, deve atualizar diretamente os dados no banco de dados final.
Eu escrevi esse procedimento e tudo funciona como pretendido, mas tenho que conceder a operação de leitura/gravação no FinalDB para o usuário de teste e não gosto disso. Existem muitos aplicativos que usam o Staging User e alguns deles não estão "sob meu controle", então não quero que um aplicativo defeituoso que deve gravar dados no Staging DB acabe mexendo com o Final DB. Posso aceitar que meu novo procedimento de teste sob demanda pode ser crítico (e acabar atrapalhando o BD Final).
Então a questão é, Staging User já tem permissão para executar um procedimento armazenado (EG : OnDemandUpdate) porque faz parte do Staging DB, mas que contém insert/update sobre uma tabela externa (do Final DB) e eu quero que a concessão possa ser acorrentado. Como eu posso fazer isso?
Acho que o que você está procurando é o encadeamento de propriedade entre bancos de dados :
Consulte os Manuais Online da Microsoft para obter mais informações. É possível ativá-lo apenas para bancos de dados individuais que podem fazer mais sentido para o seu caso de uso:
Como alternativa, outra solução poderia ser usar a
EXECUTE AS
instrução para representar um logon que tem acesso à tabela no banco deFinal
dados.Você colocaria dentro do procedimento que o
Staging
usuário tem acesso para executar, e então somente esse procedimento teria acesso para modificar a tabela no banco deFinal
dados.Com esta solução o
Staging
usuário precisaria de acesso para poder personificar o Login que está sendo usado. Isso é melhor do que concederFinal
acesso diretamente aoStaging
usuário porque você está controlando seu banco de dados por meio de procedimentos armazenados e, idealmente, o login que ele estará representando apenas tem acesso limitado (apenas a única tabela que você precisa atualizar?) no banco deFinal
dados.