Pular para o conteúdo

Connect By Prior – Consulta de todos os privilégios do usuário no BD (Parte 1)

Connect By Prior – Consulta de todos os privilégios do usuário no BD

Esse post será divido em duas partes, a primeira irá exemplificar o uso da clausula CONNECT BY PRIOR e a segunda, como ela será usada para montar a visualização hierárquica de todos os privilégios de um usuário no Banco de dados Oracle (ROLES + SYS PRIVS + OBJ PRIVS).

Um recurso muito interessante, porém pouco conhecido entre os desenvolvedores Oracle é o Connect by Pior.

Ele é capaz de organizar as linhas de uma mesma tabela de modo hierárquico.

Esse modelo de consulta em que as linhas pai e filho estão presentes na mesma tabela é conhecido como SELF JOIN.

Um exemplo bem prático do funcionamento dessa ferramenta pode ser dado usando a tabela employees:

create table employees ( emp_id number primary key , emp_name varchar2(30), manager_id number);

insert into employees values (1, 'Bill', null); -- the highest hierarchy level
insert into employees values (2, 'Peter', 1);
insert into employees values (3, 'John', 1);
insert into employees values (4, 'Maria', 2);
insert into employees values (5, 'Albert', 2);
insert into employees values (6, 'Charles', 3);
insert into employees values (7, 'Martha', 3);
insert into employees values (8, 'Joseph', 4);
insert into employees values (9, 'Michael', 4);

A linha 1 representa o cargo que não possui gerente por se tratar do nível mais alto da hierarquia, por isso seu manager_id é null.

Repare que efetuando um SELECT nessa tabela é perfeitamente possível visualizar cada funcionário e seu respectivo gerente:

select * from employees;

O objetivo agora é organizar essas linhas de modo que o funcionário com mais alto grau hierárquico seja exibido no início da lista, seguido por seus subordinados.

O comando CONNECT BY PRIOR juntamente com a cláusula auxiliar START WITH, é capaz de organizar todos os itens seguidos dos seus subitens hierarquicamente:

SELECT emp_id, emp_name, manager_id
FROM employees
START WITH manager_id is null
CONNECT BY PRIOR emp_id = manager_id;

Mesmo que de forma confusa, já possível perceber que há uma organização hierárquica, diferente da consulta anterior. Note que “Peter” é gerente de “Maria” que é gerente de “Joseph” e “Michael”.

Emitindo uma instrução usando a cláusula CONNECT BY PRIOR, a coluna LEVEL é disponibilizada, ela é responsável por exibir o nível hierárquico de cada linha na tabela.

SELECT emp_id, emp_name, manager_id, level
FROM employees
start with manager_id is null
CONNECT BY PRIOR emp_id = manager_id;

Perceba agora “Peter” e “John” fazem parte do mesmo nível hierárquico.

Usando o comando LPAD, que insere caracteres a esquerda da string é possível ter uma visualização clara de toda a hierarquia:

SELECT emp_id, lpad(' ',level*2) || emp_name, manager_id, level
FROM employees
start with manager_id is null
CONNECT BY PRIOR emp_id = manager_id;

Com esse conhecimento sobre formatação hierárquica, faremos no próximo post uma listagem de todos os privilégios do usuário, incluindo ROLES e privilégios de sistema.

O segundo post está disponível no link:

https://www.profissionaloracle.com.br/2012/10/17/connect-by-prior-consulta-de-todos-os-privilegios-do-usuario-2/
paulogerva

paulogerva

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Marcações:
plugins premium WordPress