Criando usuario a partir de um insert

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
anderson.silva
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 35
Registrado em: Sex, 20 Abr 2012 10:51 am

Boa tarde!

Pessoal,

Estou querendo criar um usuario de banco a apartir de um insert em uma tabela user(user, password)
e usaria outra tabela grants(user, grant) para as permissoes. alguém poderia me ajudar como fazer isto via trigger?

Grato,

Anderson de Abreu Silva
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá Anderson,

Me desculpe, mas será que você não está tentando "reinventar a roda"?

Tanto os usuários como as permissões se encontram em tabelas do dicionário de dados.

Existe uma série de comandos especiais para gerenciar os usuários e permissões.

Haveria algum motivo forte para você criar tabelas adicionais com estas informações?

Outras preocupações adicionais:

- Como você removeria grants ou usuários deletados destas tabelas?
- Se você fizesse updates nestas tabelas, como você conseguiria refletir isso no banco?

Fora isso, comandos como "CREATE USER" ou "GRANT .. TO" apresentam um comando COMMIT agregado, e não sei se funcionariam bem dentro de em uma TRIGGER.

Pessoalmente, acho que ficaria melhor se você gerenciasse utilizando os comandos para gerenciamento de usuários e permissões que já existem no banco. Você poderia consultar o dicionário de dados para ter uma posição atualizada dos mesmos.

Viajando um pouco, não sei se você deseja fazer isso para criar uma série de usuários com permissões diferenciadas para um determinado sistema. Seria este o caso?

Talvez os foristas possam ter uma outra opinião sobre o assunto, mas não gostaria de descrever um pouco mais de detalhes o que pretende fazer? Pode ser que minha compreensão da sua pergunta esteja incorreta.

Abraços,

Sergio Coutinho
anderson.silva
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 35
Registrado em: Sex, 20 Abr 2012 10:51 am

Stcoutinho,

Desculpe não explicar a origem da necessidade, bem, vamos la, estou desenvolvendo um aplicativo em apex, a empresa para quem eu estou desenvolvendo não tem um profissional de TI, dae a necessidade de criar dentro do aplicativo uma maneira de inserir deletar usuarios por um (ou dois) usuarios com as grants devidas.
Realmente o trigger não tem commit implícito, mas ele pode chamar uma procedure garantindo a execução.
Eu andei pesquisando e estou muito proximo de terminar este desenvolvimento, assim que possível, posto a solução completa aqui. Mesmo assim obrigado pela atenção e se alguém já tiver esta solução, aguardeco se puder compartilhar.

Grato,

Anderson de Abreu Silva
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Concordo com o STCOUTINHO.

Para isso serve o Enterprise Manager por exemplo.

E se o camarada quiser se dar grant de sysdba?

E como garantir a segurança de uma aplicação com tantos superpoderes?

O banco de dados vai ficar completamente aberto e vulnerável a todo tipo de uso mal intencionado ou não... chega-se num ponto onde não faz mais diferença a administração de privilégios, melhor liberar tudo para todos.

Além disso, tecnicamente o commit implícito ocorre também em procedure chamada por trigger. A menos que você use um autonomous transaction na trigger, o que é ALTAMENTE NÂO RECOMENDADO para esse tipo de atividade, pois quebra o paradigma ACID, violando a integridade do BD ao quebrar a atomicidade da transação: em outras palavras, você vai suar muito para garantir que a tabela de Usuário e permissões esteja em estado consistente com os usuários e as permissões do dicionário de dados e ainda assim vão ocorrer bugs.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Não sei se entendi bem a necessidade, mas acho que você poderia projetar a aplicação para executar uma API por procedure/package onde ela encapsule alguma lógica bem definida de criação (por execute immediate ou job escalonado assincronamente) de usuário e atribuição de uma role pronta para atividades rotineiras de usuário final da aplicação.

Realmente não sei qual a necessidade da tabela de usuário e permissão, parecem redundante e pode gerar alguma dificuldade de mantê-las, mas uma procedure fechada para manter essas atividades parece o ideal.
Responder
  • Informação