do bÁsico ao avanÇado para manipulaÇÃo e otimizaÇÃo … · 2012. 6. 20. · column org_chart...
TRANSCRIPT
DO BÁSICO AO AVANÇADO PARA
MANIPULAÇÃO E OTIMIZAÇÃO DE DADOS
Fábio Roberto Octaviano
Controlando Acesso dos Usuários
Após o término do Capítulo:
Diferenciar privilégios de sistema e privilégios de objetos.
Conceder privilégios em tabelas.
Verificar privilégios no Dicionário de Dados.
Dar privilégios em roles.
Distinguir entre privilégios e roles.
Database administrator
Users
Username and password
Privileges
Segurança em Banco de Dados: ◦ Segurança do Sistema ◦ Segurança de Dados
Privilégios de Sistema: conseguindo acesso ao banco de dados.
Privilégios de Objetos: manipulando o conteúdo dos objetos do banco de dados.
Esquemas: Coleção de objetos, tais como tabelas, visões e sequences.
Mais de 100 privilégios de sistema estão disponíveis no Oracle.
O DBA (administrador do banco) tem privilégios de sistema de alto nível para tarefas como:
◦ Criar novos usuários.
◦ Remover usuários.
◦ Remover tabelas.
◦ Fazer backup de tabelas.
O DBA cria usuários por meio da instrução
CREATE USER.
CREATE USER USER1
IDENTIFIED BY USER1;
User created.
CREATE USER user
IDENTIFIED BY password;
Após criar um usuário, o DBA pode conceder privilégios de sistema específicos a ele.
Um desenvolvedor, por exemplo, pode ter os seguintes privilégios de sistema: ◦ CREATE SESSION
◦ CREATE TABLE
◦ CREATE SEQUENCE
◦ CREATE VIEW
◦ CREATE PROCEDURE
GRANT privilege [, privilege...]
TO user [, user| role, PUBLIC...];
O DBA pode conceder privilégios de sistema específicos a ele.
GRANT create session, create table,
create sequence, create view
TO scott;
Grant succeeded.
Uma role é um grupo de privilégios relacionados que pode ser concedido ao usuário.
Alocando privilégios sem usar roles
Alocando privilégios utilizando roles
Privilégios
Usuários
Gerente
◦ Criação de uma role:
◦ Conceder privilégios a uma role:
◦ Conceder acesso a role para os usuários :
CREATE ROLE manager;
Role created.
GRANT create table, create view
TO manager;
Grant succeeded.
GRANT manager TO BELL, KOCHHAR;
Grant succeeded.
Normalmente, o DBA é o responsável por criar uma conta de usuário e inicializar o password.
O usuário pode alterar seu password utilizando a instrução ALTER USER.
ALTER USER HR
IDENTIFIED BY employ;
User altered.
Object
Privilege Table View Sequence Procedure
ALTER
DELETE
EXECUTE
INDEX
INSERT
REFERENCES
SELECT
UPDATE
Tipos de privilégios de objetos variam conforme o objeto.
O dono do objeto tem todos os privilégios sobre ele.
O dono do objeto pode conceder privilégios específicos aos usuários desejados.
GRANT object_priv [(columns)]
ON object
TO {user|role|PUBLIC}
[WITH GRANT OPTION];
Conceda privilégio de consulta na tabela EMPLOYEES:
Conceda privilégio de atualizar colunas específicas a usuários e roles:
GRANT select
ON employees
TO sue, rich;
Grant succeeded.
GRANT update (department_name, location_id)
ON departments
TO scott, manager;
Grant succeeded.
Conceda ao usuário autoridade de conceder seus privilégios sobre o objeto:
Permita que todos os usuários do sistema consulte dados da tabela DEPARTMENTS do esquema Alice:
GRANT select, insert
ON departments
TO scott
WITH GRANT OPTION;
Grant succeeded.
GRANT select
ON alice.departments
TO PUBLIC;
Grant succeeded.
Visão do DD Descrição
ROLE_SYS_PRIVS Privilégos de sistema dados a roles
ROLE_TAB_PRIVS Privilégos de tabela dados a roles
USER_ROLE_PRIVS Roles acessíveis ao usuário
USER_TAB_PRIVS_MADE Privilégios de objeto dados sobre os
objetos do usuário
USER_TAB_PRIVS_RECD Privilégios de objeto dados ao usuário
USER_COL_PRIVS_MADE Privilégios de objeto dados sobre as
colunas dos objetos do usuário
USER_COL_PRIVS_RECD Privilégios de objeto dados sobre as
colunas dos objetos para o usuário
USER_SYS_PRIVS Privilégos de sistema dados ao usuário
Para revogar privilégios concedidos a outros usuários, utilize a instrução REVOKE:
Privilégios concedidos a outros usuários por meio da cláusula WITH GRANT OPTION são também revogados:
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];
Como usuário Alice, revogue os privilégios SELECT e INSERT da tabela DEPARTMENTS concedidos ao usuário Scott:
REVOKE select, insert ON departments
FROM scott;
Revoke succeeded.
Resumo dos principais comandos para controle de usuários e privilégios:
Comando Ação
CREATE USER Cria um usuário (normalmente por DBA)
GRANT Concede privilégios sobre objetos a outros
usuários
CREATE ROLE Cria uma coleção de privilégios
(normalmente executado por um DBA)
ALTER USER Modifica o password de um usuário
REVOKE Revoga privilégios sobre objetos de usuário
Objetivos:
◦ Conceder privilégios de tabela a usuários.
◦ Modificar tabelas de outro usuário por meio de
privilégios recebidos.
◦ Criação de um sinônimo.
◦ Consultando as visões do Dicionário de Dados
relacionadas a privilégios.
1. Qual privilégio um usuário deve receber para conseguir fazer login no servidor Oracle? Ele é um privilégio de sistema ou de objeto?
2. Qual privilégio um usuário deve receber para conseguir criar tabelas?
3. Se você criar uma tabela, quem pode conceder privilégios sobre sua tabela a outros usuários?
4. Você é o DBA e está criando muitos usuários que requerem os mesmos privilégios de sistema. O que você deveria utilizar para tornar seu trabalho mais fácil?
5. Qual comando você deve utilizar para alterar seu próprio password?
6. Conceda a outro usuário acesso à sua tabela DEPARTMENTS e peça a ele que conceda acesso à tabela DEPARTMENTS dele. Consulte os dados de ambas as tabelas DEPARTMENTS.
GRANT SELECT ON departments TO oraxx
7. Adicione uma nova linha para SUA tabela DEPARTMENTS. Time 1 deve adicionar a linha Educação como departamento 500. Time 2 deve adicionar Finanças como departamento 510. Consulte a tabela do seu colega.
INSERT INTO departments VALUES (500, 'Educacao');
COMMIT;
-- OU, para o outro time:
INSERT INTO departments VALUES (510, ‘Financas');
COMMIT;
8. Crie um sinônimo para a tabela DEPARTMENTS do outro usuário. Depois consulte a tabela DEPARTMENTS do seu colega pelo sinônimo.
--Time1 cria um sinônimo chamado Time2.
CREATE SYNONYM team2
FOR <oraxx>.DEPARTMENTS;
--Time2 cria um sinônimo chamado Time1.
CREATE SYNONYM team1
FOR <oraxx>. DEPARTMENTS;
9. Consulte as visões do Dicionário de Dados USER_TABLES e ALL_TABLES. Compare e veja as diferenças. Depois exclua da exibição de ALL_TABLES as tabelas que você é dono.
SELECT table_name
FROM user_tables;
SELECT table_name, owner
FROM all_tables
WHERE owner <>'Oraxx‘;
10. Revogue o privilégio SELECT do outro time. Depois remova a linha inserida na tabela DEPARTMENTS no exercício 7 e confirme as mudanças.
REVOKE SELECT ON departments FROM <Oraxx>;
DELETE FROM departments WHERE department_id = 500;
COMMIT;
-- OU, para o outro time:
DELETE FROM departments WHERE department_id = 510;
COMMIT;
Consultas Hierárquicas
Após o término do Capítulo:
Interpretar o conceito de uma consulta hierárquica.
Criar um relatório estruturado em árvore.
Formatar dados hierárquicos.
Excluir ramificações de uma estrutura de árvore.
…
De Haan
King
Hunold
EMPLOYEE_ID = 100 (Parent)
MANAGER_ID = 100 (Child)
Whalen
Kochhar
Higgins
Mourgos Zlotkey
Rajs Davies Matos
Gietz Ernst Lorentz
Hartstein
Fay
Abel Taylor Grant
Vargas
WHERE condition:
expr comparison_operator expr
SELECT [LEVEL], column, expr...
FROM table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)] ;
◦ Especifica a condição que deve ser satisfeita.
◦ Aceita qualquer condição válida.
Usando a tabela EMPLOYEES, comece com o empregado cujo sobrenome seja Kochhar.
Ponto de Início
...START WITH last_name = 'Kochhar'
START WITH column1 = value
Percorra a árvore de cima para baixo (top down), usando a tabela EMPLOYEES.
Direções
Top down Column1 = Parent Key Column2 = Child Key
Bottom up Column1 = Child Key Column2 = Parent Key
CONNECT BY PRIOR column1 = column2
... CONNECT BY PRIOR employee_id = manager_id
SELECT last_name||' reports to '||
PRIOR last_name "Walk Top Down"
FROM employees
START WITH last_name = 'King'
CONNECT BY PRIOR employee_id = manager_id ;
…
SELECT employee_id, last_name, job_id, manager_id
FROM employees
START WITH employee_id = 101
CONNECT BY PRIOR manager_id = employee_id ;
Level 1 Raiz/Pai
Level 3 Pai/Filho/Folha
Level 4 Folha
De Haan
King
Hunold Whalen
Kochhar
Higgins
Mourgos Zlotkey
Rajs Davies Matos
Gietz Ernst Lorentz
Hartstein
Fay
Abel Taylor Grant
Vargas
COLUMN org_chart FORMAT A12
SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_')
AS org_chart
FROM employees
START WITH first_name='Steven' AND last_name='King'
CONNECT BY PRIOR employee_id=manager_id
É possível formatar relatórios hierárquicos utilizando LEVEL e LPAD.
Exemplo: Para mostrar os níveis de gerenciamento da empresa, começando pelo mais alto nível e identando cada um dos níveis:
Para eliminar um nó da árvore, utilize a cláusula WHERE na consulta hierárquica.
Kochhar
Higgins Whalen
Gietz
WHERE last_name != 'Higgins'
Para eliminar uma ramificação da árvore, utilize a cláusula CONNECT BY adicionando um AND na consulta hierárquica.
CONNECT BY PRIOR employee_id = manager_id
AND last_name != 'Higgins'
Gietz
Kochhar
Higgins Whalen
Objetivos:
◦ Distinguir consultas hierárquicas de consultas não-hierárquicas.
◦ Percorrer uma árvore.
◦ Formatar relatórios com LEVEL e LPAD.
◦ Removendo itens da estratura da árvore.
◦ Ordenando a saída.
1. Gere um relatório mostrando um modelo organizacional do departamento que o empregado Mourgos trabalha. Mostre os sobrenomes, salários e Ids dos departamentos.
SELECT last_name, salary, department_id
FROM employees
START WITH last_name = 'Mourgos'
CONNECT BY PRIOR employee_id = manager_id;
2. Gere um relatório mostrando a hierarquia de gerentes do empregado Lorentz. Mostre seu gerente imediato em primeiro lugar.
SELECT last_name
FROM employees
WHERE last_name != 'Lorentz'
START WITH last_name = 'Lorentz'
CONNECT BY PRIOR manager_id = employee_id
3. Gere um relatório identado mostrando a hierarquia de gerenciamento começando pelo empregado de sobrenome Kochhar. Mostre o sobrenome, ID do gerente e o ID do departamento. Coloque os aliases como no ex.
3. Solução:
COLUMN name FORMAT A20
SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,'_') name,manager_id mgr, department_id deptno
FROM employees
START WITH last_name = 'Kochhar'
CONNECT BY PRIOR employee_id = manager_id
/
COLUMN name CLEAR
4. Gere um relatório mostrando a hierarquia gerencial. Inicie com a pessoa de maior nível hierárquico. Exclua todas as pessoas com cargo IT_PROG e exclua também o empregado De Haan e os empregados que reportam a ele.
SELECT last_name,employee_id, manager_id
FROM employees
WHERE job_id != 'IT_PROG'
START WITH manager_id IS NULL
CONNECT BY PRIOR employee_id = manager_id
AND last_name != 'De Haan‘