Você está na página 1de 5

Tarefa:

Cap 2 - É hora de estabelecer os níveis de privilégios - Cenários e


soluções PNT

Membros do grupo responsável pela entrega:

Humberto Kalex Amaral Spinola de Oliveira RM88757 betokalex@gmail.com

Keunan Passos Carvalho RM87373 keunan013@gmail.com

Guilherme Yoneda RM87655 guipires00@hotmail.com

Levi Bernardelli Ciarrocchi RM86801 levibc44@gmail.com

Enzo Ganhito Trujillo RM88644 enzoganhito2@gmail.com

Entrega:
Questão 1:
CREATE VIEW consulta_dados AS
SELECT
uf.cd_uf AS cod_unidade_federacao,
uf.uf AS unidade_federacao,
mun.cd_mun AS cod_municipio,
mun.municipio AS municipio,
dbc.id AS id_dados_brutos,
db.dados_brutos AS dados_brutos,
dbc.A_2010,
dbc.A_2011,
dbc.A_2012,
dbc.A_2013,
dbc.A_2014,
dbc.A_2015,
dbc.A_2016,
dbc.A_2017,
dbc.A_2018,
dbc.A_2019
FROM unidades_federacao uf
JOIN dados_brutos_capitais dbc ON uf.cd_uf = dbc.cd_uf
JOIN municipios mun ON mun.cd_mun = dbc.cd_mun
JOIN dados_brutos db ON dbc.id = db.id
WHERE uf.cd_uf = 35;
Questão 2:
Soluções propostas:

Garantir o indexamento das informações que a query utiliza:

CREATE INDEX idx_cd_uf ON unidades_federacao (cd_uf);


CREATE INDEX idx_cd_uf_capitais ON dados_brutos_capitais (cd_uf);
CREATE INDEX idx_cd_mun_capitais ON dados_brutos_capitais (cd_mun);
CREATE INDEX idx_id_db ON dados_brutos (id);
CREATE INDEX idx_A_2019 ON dados_brutos (A_2019);

Identificar pontos de melhoria no processamento da query a partir do explain plan:

EXPLAIN PLAN FOR


select uf,
municipio,
dados_brutos,
A_2019
From unidades_federacao uf join dados_brutos_capitais dbc
on (uf.cd_uf=dbc.cd_uf)
join municipios mun
on (mun.cd_mun=dbc.cd_mun)
join dados_brutos db
on (dbc.id=db.id)
where A_2019 > 1000000
order by 4 desc;

Caso os dados sejam estáticos, é possível criar um materialized view com as informações, para
que as próximas consultas sejam mais ágeis e não precisem ser processadas:

CREATE MATERIALIZED VIEW mv_consulta_dados AS


SELECT
uf.uf,
mun.municipio,
db.dados_brutos,
dbc.A_2019
FROM unidades_federacao uf
JOIN dados_brutos_capitais dbc ON uf.cd_uf = dbc.cd_uf
JOIN municipios mun ON mun.cd_mun = dbc.cd_mun
JOIN dados_brutos db ON dbc.id = db.id
WHERE dbc.A_2019 > 1000000
ORDER BY dbc.A_2019 DESC;
Questão 3:
Para criar os usuários e administradores com os privilégios indicados, é possível utilizar a
seguinte query:

-- Criar os usuários ADMIN


CREATE USER ADMIN_SP IDENTIFIED BY SP_123;
CREATE USER ADMIN_RJ IDENTIFIED BY RJ_123;
CREATE USER ADMIN_DF IDENTIFIED BY DF_123;

-- Conceder os privilégios aos usuários ADMIN


GRANT CREATE TABLE TO ADMIN_SP;
GRANT CREATE VIEW TO ADMIN_SP;
GRANT CREATE SEQUENCE TO ADMIN_SP;
GRANT CREATE CLUSTER TO ADMIN_SP;
GRANT CREATE PROCEDURE TO ADMIN_SP;

GRANT CREATE TABLE TO ADMIN_RJ;


GRANT CREATE VIEW TO ADMIN_RJ;
GRANT CREATE SEQUENCE TO ADMIN_RJ;
GRANT CREATE CLUSTER TO ADMIN_RJ;
GRANT CREATE PROCEDURE TO ADMIN_RJ;

GRANT CREATE TABLE TO ADMIN_DF;


GRANT CREATE VIEW TO ADMIN_DF;
GRANT CREATE SEQUENCE TO ADMIN_DF;
GRANT CREATE CLUSTER TO ADMIN_DF;
GRANT CREATE PROCEDURE TO ADMIN_DF;

-- Criar os usuários USER


CREATE USER USER_SP IDENTIFIED BY abc_SP;
CREATE USER USER_RJ IDENTIFIED BY abc_RJ;
CREATE USER USER_DF IDENTIFIED BY abc_DF;

-- Conceder os privilégios aos usuários USER


GRANT CREATE TABLE TO USER_SP;
GRANT CREATE VIEW TO USER_SP;

GRANT CREATE TABLE TO USER_RJ;


GRANT CREATE VIEW TO USER_RJ;

GRANT CREATE TABLE TO USER_DF;


GRANT CREATE VIEW TO USER_DF;
Questão 4:
Para acelerar o resultado da query, é possível indexar as informações necessárias por estes
comandos, além de atualizar as estatísticas da tabela e conseguir executar a query com melhor
desempenho:

-- Utilizando índices para acelerar a consulta


CREATE INDEX idx_cd_uf ON unidades_federacao (cd_uf);
CREATE INDEX idx_cd_uf_capitais ON dados_brutos_capitais (cd_uf);
CREATE INDEX idx_cd_mun_capitais ON dados_brutos_capitais (cd_mun);
CREATE INDEX idx_id_db ON dados_brutos (id);
CREATE INDEX idx_municipio ON municipios (municipio);

-- Atualização das estatísticas da tabela


EXEC DBMS_STATS.GATHER_TABLE_STATS('unidades_federacao_pk', 'unidades_federacao');
EXEC DBMS_STATS.GATHER_TABLE_STATS('idx_cd_uf_capitais', 'dados_brutos_capitais');
EXEC DBMS_STATS.GATHER_TABLE_STATS('idx_municipio', 'municipios');
EXEC DBMS_STATS.GATHER_TABLE_STATS('idx_id_db', 'dados_brutos');
EXEC DBMS_STATS.GATHER_TABLE_STATS('idx_cd_mun_capitais', 'dados_brutos_capitais');

SELECT /*+ INDEX(uf idx_cd_uf) INDEX(dbc idx_cd_uf_capitais) INDEX(mun idx_cd_mun_capitais) INDEX(db idx_id_db)
INDEX(mun idx_municipio) */
uf.uf,
mun.municipio,
db.dados_brutos,
dbc.A_2018
FROM unidades_federacao uf
JOIN dados_brutos_capitais dbc ON uf.cd_uf = dbc.cd_uf
JOIN municipios mun ON mun.cd_mun = dbc.cd_mun
JOIN dados_brutos db ON dbc.id = db.id
--where A_2018 between 50000 and 90000
and LOWER(mun.municipio) = 'curitiba';

Questão 5:
CREATE VIEW consulta_dados_uf AS
SELECT
uf.CD_UF CODIGO_UF,
dbc.A_2019 ANO_2019,
dbc.A_2018 ANO_2018,
dbc.A_2017 ANO_2017,
dbc.A_2016 ANO_2016,
dbc.A_2015 ANO_2015,
dbc.A_2014 ANO_2014,
dbc.A_2013 ANO_2013,
dbc.A_2012 ANO_2012,
dbc.A_2011 ANO_2011,
dbc.A_2010 ANO_2010
FROM unidades_federacao uf
JOIN dados_brutos_capitais dbc ON uf.cd_uf = dbc.cd_uf
JOIN dados_brutos db ON dbc.id = db.id
WHERE dbc.CD_UF = 31;

Após a criação da view apresentada, é possível visualizar com rapidez utilizando:


SELECT * from consulta_dados_uf;

Você também pode gostar