Qual é o melhor método para conceder acesso de leitura a todos os bancos de dados atuais e futuros a um usuário (AD Group, neste caso)?
Atualmente, tenho um trabalho agendado instável que faz isso usando (vou começar a depurar o seguinte, mas talvez eu esteja fazendo errado de qualquer maneira):
sp_msforeachdb '
USE [?]
CREATE USER [MY_DOMAIN\SQL-READ-ALL] FOR LOGIN [MY_DOMAIN\SQL-READ-ALL]
USE [?]
EXEC sp_addrolemember N''db_datareader'', N''MY_DOMAIN\SQL-READ-ALL''
'
Talvez haja uma maneira melhor?
Para bancos de dados futuros , faça isso porque todos os bancos de dados são criados a partir
model
Para bancos de dados existentes, basta executar o que você tem acima, uma vez
Sobre a restauração: você pode configurar uma notificação de evento para o evento AUDIT_BACKUP_RESTORE . Não é para os fracos de coração, já que programar notificações de eventos assíncronos não é exatamente fácil , mas pode fazer o trabalho que você está pedindo. Consulte Implementando Notificações de Eventos .
Outra opção é criar um trabalho de agente do SQL Server que seja executado em um agendamento, para executar seu SQL para todos os bancos de dados.
Você também pode agrupar seu código em um procedimento armazenado, que pode ser criado no banco de dados modelo ou em um banco de dados "Utilitários".
Uma implementação possível está abaixo (isso assume que o nome de login e o nome de usuário serão os mesmos, mas podem ser modificados para lidar com nomes de login/usuário diferentes):
A partir de um trabalho do SQL Server Agent agendado para ser executado diariamente ou em um agendamento desejado, você pode chamar o acima desta forma: