Cenário:
- eu tenho instânciaA
- eu tenho instânciaB
- Eu tenho USER1 na instânciaA
- Eu tenho USER1 na instânciaB
- USER1 na instância A tem quatro funções concedidas a ele:
- ROLE1 padrão sim admin_option não
- ROLE2 default false admin_option sim
- ROLE3 default false admin_option não
- ROLE3 padrão sim admin_option sim
- USER1 na instânciaB não tem funções concedidas
- Todas as funções mencionadas também existem na instânciaB, embora não sejam concedidas a USER1
- Já escrevi um script que gera o DDL para duplicar as concessões de função para USER1 na instânciaB.
Problema:
Não encontrei uma maneira de fazer o seguinte programaticamente porque a
DEFAULT=NO
parte não existe naGRANT ROLE
cláusula.- conceder ROLE1 para USER1; -- opção de administração não
- conceder ROLE2 para USER1 DEFAULT NO com opção admin;
- conceder ROLE2 para USER1 DEFAULT NO ;
- conceder ROLE3 para USER1 com opção admin;
Observe que desejo replicar na instância B o mesmo conjunto de funções que USER1 tem na instância A, o que significa que duas das funções são padrão e duas não são .
Estudei definir a função padrão false para ROLE2 e ROLE3 depois de concedê-los, usando
ALTER USER DEFAULT ROLE
mas isso funciona apenas para definir TODAS as funções como padrão ou definir TODAS as funções como não padrão com NONE.- Não consigo encontrar uma maneira de definir apenas ROLE2 e ROLE3 como não padrão e ROLE1 e ROLE2 como padrão.
- Eu sei que posso definir isso usando o console visual, mas preciso automatizar isso, então preciso de uma forma de sintaxe para fazer isso.
- Não quero fazer com que as funções peçam senha. Todas as funções nos bancos de dados não são funções de senha.
Você deve usar o comando GRANT para conceder funções (com a opção admin, se necessário) e, em seguida, usar ALTER USER para definir as funções como padrão (ou não). Então, a ordem dos comandos é,
Uma maneira de gerar sql usando sql é a seguinte: você pode executar esse sql na instânciaA e, na verdade, executar o script gerado na instânciaB substituindo o nome de usuário, se necessário. Certifique-se de testar embora,