quarta-feira, 9 de abril de 2014

Criando usuários no Oracle, Removendo e Gerenciando

Para criar um novo usuário de acesso no banco de dados Oracle, é necessário se conectar como um usuário que tenha acesso DBA.

SQL> CREATE USER usuario123 IDENTIFIED BY senha123;
User created.

Após criarmos um novo usuário precisamos adicionar os seus GRANTS, ou seja, as permissões para o usuário:
SELECT, INSERT, DELETE, INDEX, UPDATE, ALTER, CREATE TABLE, CREATE VIEW, CREATE SEQUENCE, e quaisquer outras necessárias.

 SQL> GRANT CREATE TABLE, CREATE VIEW, CREATE SEQUENCE TO usuario123;
Grant succeeded.

Criando uma ROLE de privilégios para ser usada para vários usuários, uma role é o conjunto de privilégios que guardamos armazenados com a finalidade de proporcionar uma facilitação de manuseio na hora de se conceder privilégios, evitando a digitação de todos os privilégios, passando a ter que digitar somente o nome da role, ou seja, uma ROLE é um Grupo que tem todas as permissões que você desejar, e pode incluir vários usuários que queira que utilize aquelas permissões. No exemplo, o nome da ROLE é "aspirante" e não há privilégio dentro dela.

SQL> CREATE ROLE aspirante;
Role created.

Incluiremos os privilégios CREATE TABLE e CREATE VIEW (para criarmos tabelas e views), para a ROLE "aspirante":

SQL> GRANT CREATE TABLE, CREATE VIEW TO aspirante;
Grant succeeded.

Como a ROLE já possui alguns privilégios definidos, vamos adicionar o nosso usuário a ela. Para usar suas permissões, o usuário "usuario123" está recebendo os GRANTS da ROLE ASPIRANTE, que são CREATE TABLE e CREATE VIEW (somente para criar tabelas e views):

SQL> GRANT aspirante TO usuario123;
Grant succeeded.

Agora vamos mudar a senha do nosso usuário “usuario123” que era “senha123”, e vamos muda-la para “supersenha”:

SQL> ALTER USER usuario123 IDENTIFIED BY supersenha;
User altered.

Agora vamos dar um novo GRANT para o “usuario123” para a tabela s_emp, somente para consulta.

SQL> GRANT SELECT ON s_emp TO usuario123;
Grant succeeded.

O exemplo abaixo mostra como adicionar um novo GRANT a uma ROLE, relacionado com colunas específicas de uma tabela no caso s_dept e atribuindo a permissão de UPDATE para o usuário "usuario123" e para a ROLE "aspirante".

SQL> GRANT UPDATE(name,region_id) ON s_dept TO usuario123,aspirante;
Grant succeeded.

Este exemplo mostra como dar GRANT para um usuário em uma tabela e este usuário ter permissão de passar este mesmo GRANT para outros usuários.

SQL> GRANT SELECT ON s_emp usuario123 WITH GRANT OPTION;
Grant succeeded.

Para deixar qualquer usuário executar um SELECT na tabela s_dept que é do “usuario123”, usamos o GRANT abaixo:

SQL> GRANT SELECT ON usuario123.s_dept TO PUBLIC;
Grant succeeded.

Para sabermos quais privilégios nosso usuário possui, temos que acessar o DICIONÁRIO DE DADOS nas seguintes tabelas:

 ROLE_SYS_PRIVS
 ROLE_TAB_PRIVS
 USER_ROLE_PRIVS
 USER_TAB_PRIVS_MADE
 USER_TAB_PRIVS_RECD
 USER_COL_PRIVS_MADE
 USER_COL_PRIVS_RECD

Para ver as ROLES que o “usuario123” tem acesso, execute a query abaixo:

SQL> SELECT GRANTED_ROLE, OS_GRANTED FROM USER_ROLE_PRIVS
  WHERE USERNAME = 'usuario123';

GRANTED_ROLE OS_
------------------------------ ---
CONNECT NO
DBA NO
MANAGER NO

Para tirar um privilégio do “usuário123”, use REVOKE como abaixo:

SQL> REVOKE SELECT ON s_emp FROM usuario123;
Revoke succeeded.

No exemplo acima tiramos o privilégio de SELECT do USUÁRIO “usuario123”.

Como criar sinônimo:

Criando um sinônimo para uma tabela: no caso está sendo criado um sinônimo com o nome "departamento" para a tabela s_dept que pertence ao “usuario123”:

SQL> CREATE SYNONYM departamento FOR usuario123.s_dept;
Synonym created.

Agora estamos criando um sinônimo para uma VIEW que se chama dept_sum_vu e o nome do sinônimo criado é “soma_departamento”:

SQL> CREATE SYNONYM soma_departamento FOR dept_sum_vu;
Synonym created.

Agora estamos criando um sinônimo público, com nome "recepcao" referente à tabela s_dept do “usuário123”:

SQL> CREATE PUBLIC SYNONYM recepcao FOR usuario123.s_dept;
Synonym created.

Para dropar (apagar) um sinônimo é simples:

SQL> DROP SYNONYM departamento;

Synonym dropped.

terça-feira, 8 de abril de 2014

Boas Práticas de desenvolvimento SQL Oracle

Muitas vezes nos deparamos com uma paralisação no servidor de banco de dados.
Podemos evitar muitos destes gargalos com simples praticas diárias em nossas instruções SQL, principalmente para aqueles servidores que possuem limitações.
 
Seguem as recomendações:

1)      Usar as opções NOLOGGING e COMPRESS na criação de tabelas, índices e inserts.
Objetivo: ocupar menos espaço em banco de dados e não onerar a área de archive (que guarda os logs de todas as transações na base de dados);
 
Exemplo 1:
CREATE TABLE TABELA_1(
    CAMPO_1 VARCHAR2(50),
    CAMPO_2 VARCHAR2(50)
)
TABLESPACE TD_DADOS -- definicao da tablespace de dados
COMPRESS -- COMPRIME O TAMANHO DOS DADOS
NOLOGGING -- NÃO GRAVA OS LOGS NA HORA DO CREATE
;
 
Exemplo 2:
CREATE TABLE TABELA_3
COMPRESS
NOLOGGING
TABLESPACE TD_DADOS -- definicao da tablespace de dados
AS
    (SELECT CAMPO_3 FROM TABELA_2)
;
 
Exemplo 3: 
CREATE INDEX TABELA_1_IDX_1 ON
    TABELA_1 (CAMPO_1)
    TABLESPACE TI_DADOS -- definicao da tablespace de index
COMPRESS
NOLOGGING
;
 
2)      Usar a opção UNRECOVERABLE antes do LOAD DATA na carga de arquivos textos via SQLLDR. Objetivo: não onerar a área de archive do banco de dados;
 
3)      Não usar opções de paralelismo, pois isto pode atrapalhar a execução das queries dos outros usuários ou outras equipes que utilizam o mesmo servidor, e caso realmente precise de priorização de execução em grandes cruzamentos de informações, sempre solicite uma verificação com as equipes para discutirem os impactos.

Estas foram algumas regras que podemos implementar no nosso dia a dia, e que ajudam muito no processamento dos dados, o que ajuda muito a sairmos do trabalho mais cedo na sexta-feira para tomas uma gelaaaaada.

Se tiver alguma prática ou sugestão e desejar compartilhar, sinta-se a vontade comentando abaixo.