Universidade Federal de Pernambuco Centro de Informática Banco de Dados Avançados Banco de Dados Ativo Equipe: Felipe Cavalcante Fernando Kakimoto Marcos Corrêa
Sumário 1. Mini-Mundo... 3 1.1 Entidades... 3 1.2 Relacionamentos... 3 1.3 Objetivos... 4 2. Modelagem Conceitual... 4 3. Esquema Relacional... 5 4. Implementação... 5 4.1 Criação de tabelas... 5 4.2 Criação da view... 7 4.3 Criação dos triggers... 7
1. Mini-Mundo O projeto da disciplina será desenvolvido a partir das necessidades básicas de um hotel, visando tornar mais fácil e rápido o acesso e o gerenciamento dos dados referentes ao mesmo. Assim, as atividades diárias realizadas poderão ser registradas e recuperadas de uma maneira mais eficiente e com um melhor desempenho que o sistema tradicional de arquivos. A seguir, é feita uma descrição das entidades, seus relacionamentos e seus respectivos atributos, do projeto a ser desenvolvido, assim como seus objetivos. 1.1 Entidades Hóspede: corresponde a entidade do hóspede hotel, sendo ele identificado pelo cpf e tendo como atributos nome, telefone e o número de visitas realizadas. CPF NOME TELEFONE VISITAS Suíte: corresponde aos aposentos do hotel, sendo identificado pelo seu número e tendo como atributos o tipo, o valor e um indicador de ocupado ou desocupado. NÚMERO TIPO VALOR OCUPADO Funcionário: corresponde a entidades de funcionário do hotel, sendo identificado por ser cpf e tendo como atributos o nome, função realizada, telefone salário. CPF NOME FUNCAO TELEFONE SALARIO 1.2 Relacionamentos Reserva: relacionamento existente entre hóspedes, que se hospedam no hotel, e os funcionários que anotam a reserva. Esta relação é identificada por um identificador próprio e possui como atributos o cpf do hóspede, o cpf do funcionário, o numero da suíte reservada e as datas final e inicial da reserva. ID HOSPEDE_CPF FUNCIONARIO_CPF NUMERO_SUITE DATA_INICIAL DATA_FINAL Estadia: relacionamento entre hóspedes do hotel e suas suítes. Esta relação é identificada por um identificador próprio e tem como atributos o cpf do hospede, numero da suíte onde o hóspede se hospedou, datas de chegada e saída do hotel e a conta final. ID HOSPEDE_CPF FUNCIONARIO_CPF CONTA DATA_INICIAL DATA_FINAL
Serviço: relacionamento entre o funcionário e a suíte do hotel. Esta relação é identificada com um identificador próprio e tem como atributos o numero da suíte que pediu o serviço, o funcionário que o realizou, o valor do serviço e a sua data. ID NOME FUNCIONARIO_CPF NUMERO_SUITE VALOR DATA 1.3 Objetivos De acordo com o mostrado anteriormente, busca-se automatizar o cadastro de reservas, funcionários, hóspedes e suítes, além de controlar e recuperar dados de contas parciais, suítes ocupadas e serviços prestados em todo o ambiente hoteleiro. Ou seja, estar-se-á melhorando a eficiência e o desempenho tanto o aspecto gerencial, quanto o operacional das atividades do hotel. 2. Modelagem Conceitual A seguir é mostrado o modelo Entidade-Relacional do projeto com todas as entidades e atributos, assim como seus relacionamentos.
3. Esquema Relacional A seguir, é mostrado o modelo Relacional do projeto a ser desenvolvido. Na figura, estão as entidades e relações citadas anteriormente, além das suas respectivas chaves primárias e secundárias. 4. Implementação Para a implementação do projeto, utilizou-se a padrão da linguagem SQL e o Banco de Dados Oracle, na versão 10. Segue abaixo o código SQL utilizado: 4.1 Criação de tabelas --Tabela de suites CREATE TABLE TBSUITE ( NUMERO NUMBER NOT NULL, TIPO VARCHAR2(20) NULL, VALOR FLOAT NULL, OCUPADO CHARACTER(1) NULL, PRIMARY KEY (NUMERO)
--Tabela de funcionarios CREATE TABLE TBFUNCIONARIO ( CPF VARCHAR2(11) NOT NULL, NOME VARCHAR2(50) NULL, CARGO VARCHAR2(20) NULL, SALARIO FLOAT NULL, TELEFONE VARCHAR2(15) NULL, PRIMARY KEY (CPF) --Tabela de hóspedes CREATE TABLE TBHOSPEDE ( CPF VARCHAR2(11) NOT NULL, NOME VARCHAR2(50) NULL, TELEFONE VARCHAR2(15) NULL, VISITAS NUMBER NOT NULL, PRIMARY KEY (CPF) --Tabela de estadias CREATE TABLE TBESTADIA ( ID_ESTADIA NUMBER NOT NULL, NUMERO_SUITE NUMBER NULL, HOSPEDE_CPF VARCHAR2(11) NULL, CHEGADA DATE NULL, SAIDA DATE NULL, CONTA FLOAT NULL, PRIMARY KEY (ID_ESTADIA), FOREIGN KEY (NUMERO_SUITE) REFERENCES TBSUITE (NUMERO), FOREIGN KEY (HOSPEDE_CPF) REFERENCES TBHOSPEDE (CPF) --Tabela de reservas CREATE TABLE TBRESERVA ( ID_RESERVA NUMBER NOT NULL, HOSPEDE_CPF VARCHAR2(11) NULL, FUNCIONARIO_CPF VARCHAR2(11) NULL, NUMERO_SUITE NUMBER NULL, CHEGADA DATE NULL, SAIDA DATE NULL, PRIMARY KEY (ID_RESERVA), FOREIGN KEY (HOSPEDE_CPF) REFERENCES TBHOSPEDE (CPF), FOREIGN KEY (FUNCIONARIO_CPF) REFERENCES TBFUNCIONARIO (CPF), FOREIGN KEY (NUMERO_SUITE) REFERENCES TBSUITE (NUMERO)
--Tabela de serviços CREATE TABLE TBSERVICO ( ID_SERVICO NUMBER, NOME VARCHAR2 (15), NUMERO_SUITE NUMBER, FUNCIONARIO_CPF VARCHAR2(11), DIA DATE, VALOR FLOAT, PRIMARY KEY (ID_SERVICO), FOREIGN KEY (NUMERO_SUITE) REFERENCES TBSUITE (NUMERO), FOREIGN KEY (FUNCIONARIO_CPF) REFERENCES TBFUNCIONARIO (CPF) 4.2 Criação da view --View para uso da cláusula INSTEAD OF create view reservas as select id_reserva, hospede_cpf, funcionario_cpf, numero_suite, chegada, saida from tbreserva; 4.3 Criação dos triggers -- Trigger que antes de inserir uma estadia, atualiza a suíte informando que ela está ocupada. create or replace trigger insertestadia before insert on tbestadia update tbsuite set ocupado = 'S' where numero = :new.numero_suite; -- Trigger que depois de atualizar a saida de uma estadia, atualiza a suite informando que ela está desocupada. create or replace trigger updateestadia after update of saida on tbestadia referencing new as n old as o when(n.saida is not null) declare valorsuite number, dias integer; update tbsuite set ocupado = 'N' where numero = :n.numero_suite;
-- Trigger que antes de deletar uma estadia, atualiza a suíte informando que ela está desocupada; create or replace trigger deleteestadia before delete on tbestadia update tbsuite set ocupado = 'N' where numero = :old.numero_suite; -- Trigger que depois de inserir uma estadia, verifica se todas as suites estão ocupadas, se isto acontecer, ela atualiza o salario dos funcionários dando um aumento de 10% no seu salario. create or replace trigger gratificacao after insert on tbestadia declare total number; ocupados number; select count(numero) into ocupados from tbsuite where ocupado = 'S'; select count(numero) into total from tbsuite; if(total = ocupados) then update tbfuncionario set salario = salario*1.1; end if; -- Trigger que depois de inserir um serviço, atualiza o valor da conta do hóspede adicionando o valor do serviço a conta. create or replace trigger insertservico after insert on tbservico declare valorservico float; valorservico := :new.valor; update tbestadia set conta = conta + valorservico where numero_suite = :new.numero_suite;
--Trigger que antes de deletar um serviço, atualiza o valor da conta do hóspede diminuindo o valor do serviço a conta. create or replace trigger deleteservico before delete on tbservico declare valorservico float; valorservico := :old.valor; update tbestadia set conta = conta - valorservico where numero_suite = :old.numero_suite; --View de reservas para criação do trigger com instead of. create view reservas as select id_reserva, hospede_cpf, funcionario_cpf, numero_suite, chegada, saida from tbreserva; --Trigger que em vez de inserir uma reserva, verifica se ela utrapassou o limite de reservas estipulado pelo hotel, se não estrapolou o limite ela insere a reserva. create or replace trigger insertreserva instead of insert on reservas declare total number; select count(id_reserva) into total from tbreserva; if (total < 3) then insert into tbreserva values(:new.id_reserva, :new.hospede_cpf, :new.funcionario_cpf, :new.numero_suite, :new.chegada, :new.saida end if;