Matrículas, Papéis e XML em Oracle: Guia Completo

Computação4,56 KB

1) Modelagem de Matrículas: Tabelas, Sequences, Triggers e Procedure

As tabelas utilizadas para matrículas são:
  • ALUNO: codigo INT PRIMARY KEY NOT NULL, nome VARCHAR2(50), email VARCHAR2(50), curso INT, chave estrangeira referenciando a tabela CURSO.
  • CURSO: codigo INT PRIMARY KEY NOT NULL, descricao VARCHAR2(50).
  • RESUMO: curso INT, chave estrangeira referenciando a tabela CURSO, quantidade INT.
Cria-se uma SEQUENCE para cada tabela, de modo que os campos "codigo" sejam controlados pelas respectivas SEQUENCEs.
Uma TRIGGER para cada tabela gera o próximo código antes da inclusão de dados.
Uma STORED PROCEDURE alimenta a tabela RESUMO com a quantidade de matrículas efetuadas por curso. Após todas as matrículas, executa-se a procedure para gerar o resumo.

Solução

CREATE TABLE CURSO (
  CODIGO INT NOT NULL PRIMARY KEY,
  DESCRICAO VARCHAR2(50)
);

CREATE TABLE ALUNO (
  CODIGO INT NOT NULL PRIMARY KEY,
  NOME VARCHAR2(50),
  EMAIL VARCHAR2(50),
  CURSO INT,
  CONSTRAINT fk_CURSOALUNO FOREIGN KEY (CURSO) REFERENCES CURSO (CODIGO)
);

CREATE TABLE RESUMO (
  CURSO INT,
  QUANTIDADE INT,
  CONSTRAINT fk_CURSO FOREIGN KEY (CURSO) REFERENCES CURSO (CODIGO)
);

CREATE SEQUENCE SEQ_CURSO MINVALUE 1 MAXVALUE 999999999 START WITH 1 INCREMENT BY 1;

CREATE SEQUENCE SEQ_ALUNO MINVALUE 1 MAXVALUE 999999999 START WITH 1 INCREMENT BY 1;

CREATE OR REPLACE TRIGGER TG_CURSO
BEFORE INSERT ON CURSO
FOR EACH ROW
BEGIN
  SELECT SEQ_CURSO.NEXTVAL INTO :NEW.CODIGO FROM DUAL;
END;
/

CREATE OR REPLACE TRIGGER TG_ALUNO
BEFORE INSERT ON ALUNO
FOR EACH ROW
BEGIN
  SELECT SEQ_ALUNO.NEXTVAL INTO :NEW.CODIGO FROM DUAL;
END;
/

INSERT INTO CURSO (DESCRICAO) VALUES ('BANCO DE DADOS');

SELECT * FROM CURSO;
SELECT * FROM ALUNO;

INSERT INTO ALUNO (NOME, EMAIL, CURSO) VALUES ('LORA', '[email protected]', 3);

CREATE OR REPLACE PROCEDURE SP_RESUMO AS
BEGIN
  DELETE FROM RESUMO WHERE 1 = 1;
  INSERT INTO RESUMO (
    SELECT CURSO.CODIGO,
           (SELECT COUNT(*) FROM ALUNO WHERE ALUNO.CURSO = CURSO.CODIGO) AS QUANTIDADE
    FROM CURSO
  );
END;
/

EXEC SP_RESUMO;

SELECT * FROM RESUMO;

2) Papéis (Roles) e Privilégios

Deseja-se criar três papéis para os grupos de administração do banco de dados:
  • Administradores: podem ter qualquer privilégio de sistema e de objeto.
  • Gerentes: podem ter apenas privilégios de objetos e conceder privilégio de Gerente a outros usuários.
  • Operadores: podem ter apenas privilégios de consulta, alteração e inclusão.
CREATE ROLE Administradores;
CREATE ROLE Gerentes;
CREATE ROLE Operadores;

GRANT
  CREATE SESSION,
  CREATE SEQUENCE,
  CREATE TABLE,
  CREATE PROCEDURE,
  CREATE VIEW,
  CREATE USER,
  DROP TABLE,
  DROP USER,
  EXECUTE ANY PROCEDURE,
  CREATE TRIGGER
TO Administradores;

SELECT 'GRANT ALL ON ' || object_name || ' TO GERENTES;'
FROM user_objects;

SELECT 'GRANT SELECT, UPDATE, INSERT ON ' || object_name || ' TO OPERADORES;'
FROM user_objects;
Tabelas de privilégios para consulta: ALL_TAB_PRIVS, SESSION_ROLES, DBA_ROLES, DBA_SYS_PRIVS, DBA_TAB_PRIVS, USER_TAB_PRIVS_MADE, USER_COL_PRIVS_MADE.

3) Exportação em XML das tabelas ALUNO e CURSO

Com XMLELEMENT, os elementos podem ser montados de três formas: elementos aninhados, atributos (XMLATTRIBUTES) ou XMLFOREST.
-- ALUNO com elementos aninhados
SELECT XMLELEMENT(
  "ALUNO",
  XMLELEMENT("CODIGO", CODIGO),
  XMLELEMENT("NOME", NOME),
  XMLELEMENT("EMAIL", EMAIL),
  XMLELEMENT("CURSO", CURSO)
) AS XML_ALUNO
FROM ALUNO;

-- ALUNO com atributos
SELECT XMLELEMENT(
  "ALUNO",
  XMLATTRIBUTES(CODIGO AS "CODIGO", NOME AS "NOME", EMAIL AS "EMAIL", CURSO AS "CURSO")
) AS XML_ALUNO
FROM ALUNO;

-- ALUNO com XMLFOREST
SELECT XMLELEMENT(
  "ALUNO",
  XMLFOREST(CODIGO AS "CODIGO", NOME AS "NOME", EMAIL AS "EMAIL", CURSO AS "CURSO")
) AS XML_ALUNO
FROM ALUNO;

-- CURSO com elementos aninhados
SELECT XMLELEMENT(
  "CURSO",
  XMLELEMENT("CODIGO", CODIGO),
  XMLELEMENT("DESCRICAO", DESCRICAO)
) AS XML_CURSO
FROM CURSO;

-- CURSO com atributos
SELECT XMLELEMENT(
  "CURSO",
  XMLATTRIBUTES(CODIGO AS "CODIGO", DESCRICAO AS "DESCRICAO")
) AS XML_CURSO
FROM CURSO;

-- CURSO com XMLFOREST
SELECT XMLELEMENT(
  "CURSO",
  XMLFOREST(CODIGO AS "CODIGO", DESCRICAO AS "DESCRICAO")
) AS XML_CURSO
FROM CURSO;

Baixar

PDF Word HTML