Eu tenho um banco de dados (DB1) que está sincronizado com (DB2) em outro servidor (via AlwaysOn - SQL Server 2014).
Desejo dar a um usuário acesso de leitura ao DB2. Eu crio um login SQL e um usuário de banco de dados no DB1. O novo usuário do banco de dados é migrado para o DB2, mas o login SQL não é (o que faz sentido).
O problema é que quando tento criar um login SQL para o usuário no DB2 e dar ao usuário direitos de leitura para o DB2, vinculado à conta do usuário que veio do DB1, recebo um erro dizendo que o DB2 é somente leitura e não pode ser modificado.
Então, como posso conseguir isso?
Você precisa criar o login no servidor DB2. Use o script de Robert para que ele pegue o sid e a senha, bem se for uma conta SQL que é.
Em seguida, conceda a permissão no DB1. Essa permissão será automaticamente copiada para o DB2 devido ao AG.
Não há como apenas conceder permissão no DB2. Tem que ser feito no DB1. No entanto, você pode controlar o acesso desabilitando o login no DB1.
Uma opção para automatizar a sincronização dos logins entre suas réplicas de AG, se desejado, mas também pode ser usada uma única vez.
dbatools é um módulo que oferece algum código para migração de instâncias do SQL Server, mas eu também costumava manter as réplicas do AG sincronizadas.
A principal função que você precisa para simplesmente sincronizar logins é
Copy-SqlLogin
. Isso incluirá o SID, a senha e outras propriedades vistas via SSMS (mapeamentos de banco de dados, etc.). É uma funcionalidade semelhante à que o script Tara referenciou .Esse comando sozinho copiará os logins do DB1 para o DB2 e simplesmente sincronizará qualquer coisa que tenha sido alterada. Digamos que você adicione outro banco de dados ao AG e conceda um acesso de login (mapear um usuário), então da próxima vez que você executar o comando acima, ele atualizará esse login no DB2 para você.
O script abaixo está incluído para completar apenas para mostrar o que pode ser feito. Eu construí o processo abaixo no AG de 4 nós de um cliente como uma tarefa agendada. Além disso, oferece a capacidade de excluir réplicas, se necessário; era algo que eles precisavam.
Você disse que acabou de criar o login no primeiro servidor e o usuário correspondente foi migrado para o DB2. Então tudo que você precisa é criar o mesmo login no segundo servidor preservando seu sid, e você pode fazer isso primeiro copiando o sid do login de sys.server_principals e depois criando o mesmo login usando com sid assim:
Ao criar o mesmo login no segundo servidor, você terá que criá-lo com o mesmo SID e senha que foram criados no servidor Primário. Os passos que sigo estão listados abaixo:
Execute o seguinte procedimento armazenado, que foi criado como aprt da Etapa 1, passando o “Nome de Login” para ele
Copie o script gerado da etapa acima e execute-o na réplica secundária
Acredito que esse é o tipo de coisa que a contenção parcial foi projetada para resolver.
Observe que há algumas considerações se você optar por usar um banco de dados parcialmente contido.
Veja como você pode configurar isso usando o primário (lembre-se de testar em um ambiente de não produção para que você possa saber como seu ambiente de produção pode responder à lista de considerações mencionada acima).