É comum clientes de empresas que prestam serviço de outsourcing delegarem funções de suporte a seus bancos de dados, os quais encontram-se espalhados ao redor do mundo. Neste contexto, grande parte dos ambientes onde esses bancos de dados se encontram são ambientes muito controlados por questões de segurança, afinal trata-se de bancos de dados de produção, cujos dados correspondem a grande parte do capital das empresas. Esse controle se estende claramente às formas de acesso, limitando as aplicações que se conectam aos servidores e aos bancos de dados.
Por este motivo, ferramentas visuais de gerenciamento do banco de dados, tais como Oracle SQL Developer, Toad, dentre outras, não são permitidas. Assim sendo, em muitos casos, a única solução para acessar uma base Oracle é o SQLPlus, por ser nativo.
DBAs que trabalham com manutenção e gerenciamento de bancos de dados comumente executam um conjunto restrito de scripts, dentre comandos to tipo DDL e DML, além das funções de atualização, shutdown e start das bases. Tais scripts são sempre muito parecidos, mudando-se apenas um ou outro valor nas colunas listadas na cláusula where.
A ideia inicial do uso de variáveis de substituição nestes scripts é possibilitar o reaproveitamento de todo o código, onde o responsável por sua execução entra com valores (nome de tabelas, nome de colunas ou valores para comparação) em tempo de execução. Ou seja, ao chamar o script de dentro do SQLPlus com o "@", tais valores são digitados em tempo de execução, como mostra o exemplo a seguir.
SELECT first_name || ' ' || last_name as "Full Name"
WHERE employee_id = &ID_DO_EMPREGADO;
A execução do código acima solicita ao usuário que seja digitado um valor para a variável ID_DO_EMPREGADO, que posteriormente será utilizada para comparar valores da coluna employee_id da tabela Employees com o valor digitado, como mostra a figura a seguir.
Pois bem, até o momento as variáveis de substituição podem ajudar muito, mas ainda existe um problema. Temos uma variedade grande de scripts que executamos, e mesmo havendo reaproveitamento dos scripts, temos que encontra-los, carrega-los no SQLPlus para depois executá-los. Pensando neste problema, não seria muito mais adequado se houvesse um menu com opções, onde cada opção está atrelada à execução de um script em específico? Dessa forma, depois de programar os scripts e o menu, não será mais necessário mexer em qualquer código SQL, mas sim somente interagir com o menu e os valores pedidos dentro de cada script.
Para melhor ilustrar o exemplo, construí um pequeno sistema de menu para o gerenciamento de usuários dentro do banco de dados, onde construí uma série de scripts para fazer o gerenciamento dos usuários do banco. São eles
create_user.sql – Cria um usuário
CREATE USER &&User
PROFILE &Profile;
GRANT CONNECT TO &user;
@C:/menu/menu.sql
create_user_expired.sql – Cria um usuário expirado
PROFILE &Profile
verify_user.sql – Verifica o status de um usuário
SELECT username as "User", account_status as "Status"
WHERE username = UPPER('&User');
change_pwd_user.sql – Altera a senha de um usuário
ALTER USER &USER IDENTIFIED BY &Password;
change_pwd_expire_user.sql – Altera a senha e deixa o usuário expirado
ALTER USER &User IDENTIFIED BY &Password PASSWORD EXPIRE;
unlock_user.sql – Desbloqueia um usuário
ALTER USER &User ACCOUNT UNLOCK;
lock_user.sql – Bloqueia um usuário
ALTER USER &User ACCOUNT LOCK;
drop_user.sql – Remove um usuário e todos os seus objetos
DROP USER &User CASCADE;
sair.sql
Todos os scripts, incluindo o menu, devem ficar armazenados dentro de uma mesma pasta. No Windows, criei meu exemplo na pasta scripts, que se localiza na raiz C:
O que nos resta agora é escrever o script que desenha um menu no SQLPlus, que será utilizado para chamar os demais scripts utilizados no gerenciamento dos usuários e depois invoca-lo no SQLPlus pelo @.menu.sql
UNDEFINE V_SCRIPT
PROMPT |-------------------------------|
PROMPT |   GERENCIAMENTO DE USUARIOS   |
PROMPT   ESCOLHA A OPCAO DESEJADA:
PROMPT   1 - Criar Usuario
PROMPT   2 - Criar Usuario Expirado
PROMPT   3 - Verificar Status do Usuario
PROMPT   4 - Mudar a Senha do Usuario
PROMPT   5 - Mudar a Senha do Usuario com Opcao Expirado
PROMPT   6 - Desbloquear Usuario
PROMPT   7 - Bloquear Usuario
PROMPT   8 - Remover Usuario
PROMPT   9 - Sair
ACCEPT SELECTION PROMPT "Digite a opcao: "
WHEN '1' THEN 'C:/menu/create_user.sql'
WHEN '2' THEN 'C:/menu/create_user_expired.sql'
WHEN '3' THEN 'C:/menu/verify_user.sql'
WHEN '4' THEN 'C:/menu/change_pwd_user.sql'
WHEN '5' THEN 'C:/menu/change_pwd_expire_user.sql'
WHEN '6' THEN 'C:/menu/unlock_user.sql'
WHEN '7' THEN 'C:/menu/lock_user.sql'
WHEN '8' THEN 'C:/menu/drop_user.sql'
WHEN '9' THEN 'C:/menu/sair.sql'
ELSE 'C:/menu/menu.sql'
@&v_script.
O script usa, além das variáveis de substituição, a função CASE, que seleciona o script a ser executado dependendo da função escolhidaComo os DBAs tem sempre uma pasta reservada a eles dentro dos servidores, colocar a pasta "menu" dentro dessa pasta é uma boa opção.
Só lembre-se de atualizar o caminho dos scripts, que no exemplo apontam sempre para 'C:/menu/".
Tags: sqlsqlplus
Next story Terças de Dados #39 – Exportando Profissionais! Mitos e fatos sobre os profissionais expatriados.