Por que o banco de dados MSDB é TRUSTWORTHY?

9

A TRUSTWORTHYconfiguração pode ser bastante perigosa se você não tomar cuidado e, exceto em circunstâncias específicas, a recomendação é mantê-la desativada. No entanto, por padrão, o MSDBbanco de dados foi TRUSTWORHTYdefinido ONpor padrão. Estou curioso por quê?

Eu li esta entrada no BOL

Nota Por padrão, a configuração TRUSTWORTHY está definida como ON para o banco de dados MSDB. Alterar essa configuração de seu valor padrão pode resultar em um comportamento inesperado dos componentes do SQL Server que usam o banco de dados MSDB.

Mas estou curioso sobre detalhes. Por que especificamente a MSDBnecessidade está TRUSTWORTHYativada? Que funções o utilizam?

Kenneth Fisher
fonte
2
Apenas um pensamento rápido sem a pesquisa de POR QUE seria para que o serviço SQL Agent possa interagir com todos os DBs em uma instância, para usar o email do DB para notificações, outros recursos externos; caminhos, objetos do AD etc. nos trabalhos do SQL Agent.
Juice Pimp TI
11
@JUICED_IT também histórico de tarefas do SQL Agent, histórico de monitor de envio de logs, pacotes SSIS, dados do Orientador de Otimização do Mecanismo de Banco de Dados e dados da fila do Service Broker e informações de backup. É disso que você deseja um comportamento padrão. sqlperformance.com/2015/07/sql-maintenance/msdb
ConstantineK
Suspeito que seja necessário para qualquer coisa que use chamadas entre bancos de dados. Você deve desligar TRUSTWORTHYpara msdbver o que para de funcionar e você terá pelo menos parte da resposta :). Achei que o BACKUP teria problemas, mas tentei e conseguiu.
Solomon Rutzky 25/03

Respostas:

3

Existem dezenas de objetos msdbnessa referência ao masterbanco de dados.

Se msdb não estivesse marcado como TRUSTWORTHY, os usuários precisariam de permissão para o msdbobjeto com o qual estão interagindo, além do masterobjeto que está sendo referenciado.

Por exemplo, os usuários do msdb que obtêm permissões por meio da função de banco de dados SQLAgentUserRole recebem permissão para executar msdb.dbo.sp_enum_sqlagent_subsystems. A pilha de chamadas para esse procedimento eventualmente atinge master:

* msdb.dbo.sp_enum_sqlagent_subsystems
    * msdb.dbo.sp_enum_sqlagent_subsystems_internal
        * master.dbo.xp_instance_regread

Se msdbnão estiver marcado como TRUSTWORTHY, os usuários que fazem parte da função de banco de dados SQLAgentUserRole TAMBÉM precisarão executar permissão master.dbo.xp_instance_regread.

Tecnicamente falando, provavelmente é possível remover a TRUSTWORTHYconfiguração msdbe conceder permissões específicas no master. No entanto, essas permissões necessárias não são documentadas nem suportadas.

AMtwo
fonte
Você provavelmente está certo, mas, nesse caso, é igualmente importante que o proprietário do MSDB tenha essas permissões.
Kenneth Fisher
@KennethFisher Provavelmente? Normalmente, não mexo com o proprietário do banco de dados para msdb, então não tenho certeza. Eu sempre deixei como sa. Eu legitimamente não tinha pensado nisso.
AMtwo
Ahh, mas se eu tiver as permissões corretas no MSDB que eu possa usar que o acesso sa em combinação com confiança para assumir o seu servidor :)
Kenneth Fisher
Verdade. Mas é por isso que o acesso aos bancos de dados do sistema deve ser cuidadosamente restrito. Se você não é um DBA, não precisa entrar no banco de dados do sistema.
AMtwo