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 Username and password Privileges Users
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 user IDENTIFIED BY password; CREATE USER USER1 IDENTIFIED BY USER1; User created.
Após criar um usuário, o DBA pode conceder privilégios de sistema específicos a ele. GRANT privilege [, privilege...] TO user [, user role, PUBLIC...]; Um desenvolvedor, por exemplo, pode ter os seguintes privilégios de sistema: CREATE SESSION CREATE TABLE CREATE SEQUENCE CREATE VIEW CREATE PROCEDURE
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. Usuários Gerente Privilégios Alocando privilégios sem usar roles Alocando privilégios utilizando roles
Criação de uma role: CREATE ROLE manager; Role created. Conceder privilégios a uma role: GRANT create table, create view TO manager; Grant succeeded. Conceder acesso a role para os usuários : 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: GRANT select ON employees TO sue, rich; Grant succeeded. Conceda privilégio de atualizar colunas específicas a usuários e roles: 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: GRANT select, insert ON departments TO scott WITH GRANT OPTION; Grant succeeded. Permita que todos os usuários do sistema consulte dados da tabela DEPARTMENTS do esquema Alice: GRANT select ON alice.departments TO PUBLIC; Grant succeeded.
Visão do DD ROLE_SYS_PRIVS ROLE_TAB_PRIVS USER_ROLE_PRIVS Descrição Privilégos de sistema dados a roles Privilégos de tabela dados a roles 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 CREATE USER GRANT CREATE ROLE ALTER USER REVOKE Ação Cria um usuário (normalmente por DBA) Concede privilégios sobre objetos a outros usuários Cria uma coleção de privilégios (normalmente executado por um DBA) Modifica o password de um usuário 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.
MANAGER_ID = 100 (Child) EMPLOYEE_ID = 100 (Parent) King Kochhar De Haan Mourgos Zlotkey Hartstein Whalen Higgins Hunold Rajs Davies Matos Vargas Gietz Ernst Lorentz Abel Taylor Grant Fay
SELECT [LEVEL], column, expr... FROM table [WHERE condition(s)] [START WITH condition(s)] [CONNECT BY PRIOR condition(s)] ; WHERE condition: expr comparison_operator expr
Ponto de Início Especifica a condição que deve ser satisfeita. Aceita qualquer condição válida. START WITH column1 = value Usando a tabela EMPLOYEES, comece com o empregado cujo sobrenome seja Kochhar....START WITH last_name = 'Kochhar'
CONNECT BY PRIOR column1 = column2 Percorra a árvore de cima para baixo (top down), usando a tabela EMPLOYEES.... CONNECT BY PRIOR employee_id = manager_id Direções Top down Bottom up Column1 = Parent Key Column2 = Child Key Column1 = Child Key Column2 = Parent Key
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 King Kochhar De Haan Mourgos Zlotkey Hartstein Whalen Higgins Hunold Rajs Davies Matos Vargas Level 3 Pai/Filho/Folha Fay Gietz Ernst Lorentz Abel Taylor Grant Level 4 Folha
É 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: 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
Para eliminar um nó da árvore, utilize a cláusula WHERE na consulta hierárquica. WHERE last_name!= 'Higgins' Kochhar Whalen Higgins Gietz
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' Kochhar Whalen Higgins Gietz
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