Você está na página 1de 8

UNIVERSIDADE DE TRÁS­OS­MONTES E ALTO DOURO 

LIC. EM INFORMÁTICA, LIC. EM TIC E LIC. EM MATEMÁTICA

BASES DE DADOS 
Resolução proposta de: Afonso Ferreira Gomes
2007/2008 2ª Chamada 1º Semestre 

NÃO GARANTO 100% EXATIDÃO
ERROS DETECTADOS? INFORMEM­ME  penaf@yahoo.com

1. Em termos de desenvolvimento e manutenção de sistemas, compare as facilidades obtidas pela 
utilização de tecnologia de bases de dados relativamente aos sistemas de gestão de ficheiros. 

Dados são apenas elementos ou valores discretos que, isoladamente, não têm qualquer
valor, só se transformando em informação quando analisados de alguma forma. Com o
evoluir do tempo e das tecnologias, a gestão informática de dados passou da técnica de
gestão de ficheiros para modernos sistemas de Base de Dados
Utilizando sistemas de gestão de ficheiros, as organizações começaram por automatizar
algumas tarefas até aí realizadas manualmente. Estes sistemas surgiram no panorama
informático das organizações sem qualquer relação com os sistemas já existentes,
constituindo assim “ilhas isoladas” entre si.
Os dados como são actualizados independentemente pelas respectivas aplicações, existe
uma grande probabilidade de ocorrência de incoerências – redundância não controlada.
Outra consequência grave deste tipo de gestão de dados: o acesso concorrente aos
dados partilhados tem de ser feito ao nível das aplicações, utilizando funções de baixo-
nivel disponibilizadas pelo sistema operativo – o que vem por em causa a fiabilidade dos
próprios sistemas.
Os sistemas de bases de dados surgem como tentativa de resolver estes problemas. A
abordagem pelos sistemas de bases de dados tem uma característica fundamental – os
dados são organizados num único conjunto. Isto é, em vez de estarem separados por
várias unidades independentes, os dados encontram-se integrados numa só unidade
(lógica) de armazenamento.
Todos os acessos aos dados passam sempre por uma entidade designada Sistema de
Gestão de Bases de Dados (SGBD), que centraliza em si o acesso físico à base de dados.
A interface lógica entre o nível aplicacional e a base de dados é conseguida à custa do
armazenamento na base de dados, não só dos dados propriamente ditos, mas também
das suas descrições (metadados), numa entidade conhecida por dicionário de dados
(também chamado catálogo).

2.  Considere   que   se   pretende   criar   um   sistema   de   base   de   dados   para   gerir   reparações   em 
equipamentos   de   estações   de   extracção   de   petróleo.   O   sistema   deve   registar   as   estações   de 
extracção   de   petróleo   e   os   equipamentos   associados.   Uma   estação   de   extracção   de   petróleo   é 
caracterizada por um identificador, um nome e uma localização. Por seu lado, os equipamentos são 
caracterizados por um número de identificação, um nome, um fabricante e uma data de aquisição. 
Um equipamento está associado a uma categoria. As categorias estão organizadas hierarquicamente 
e são caracterizadas por um número identificador, um nome e um grau de importância. O sistema 
deve também ser capaz de registar as intervenções sobre os equipamentos da estação de extracção 
de   petróleo,   sabendo   que   cada   operação   é   efectuada   por   dois   mecânicos,   um   responsável   pela 
reparação e outro pela verificação. Para cada intervenção o sistema regista, além dos mecânicos 
associados   à   operação,   a   data   de   intervenção   e   uma   pequena   descrição.   Cada   mecânico   é 
caracterizado por um número único de identificação, um nome e um contacto telefónico. 

2.1. Desenhe o diagrama conceptual para a base de dados do sistema de gestão de reparações em 
estações de extracção de petróleo. 
2.2. Com base no modelo conceptual definido anteriormente, elabore, em linguagem SQL, a base de 
dados   relacional   tendo   em   consideração   os   conceitos   de   normalização   (1FN,   2FN   e   3FN)   e   a 
integridade   de   domínio,   entidade   e  referencial.   Garanta,   ainda,   alguma   integridade   dos  dados   do 
sistema que considere fundamental. 

-- Criação e utilização de Base de Dados

CREATE DATABASE Petroleo


GO
USE Petroleo
Go

-- Criação das tabelas das Entidades

CREATE TABLE Mecanico (


id_mec INT NOT NULL,
telefone INT NOT NULL,
nome_mec VARCHAR(50) NOT NULL,
CHECK(id_mec>0),
PRIMARY KEY(id_mec)
)

CREATE TABLE Categoria (


idCat INT NOT NULL,
grau_imp VARCHAR(50) NOT NULL,
nome_cat VARCHAR(50) NOT NULL,
CHECK(idCat>0),
PRIMARY KEY(idCat)
)

CREATE TABLE Estacoes (


id_estacao INT NOT NULL,
localizacao VARCHAR(50) NOT NULL,
nome_estacao VARCHAR(50) NOT NULL,
CHECK(id_estacao>0),
PRIMARY KEY(id_estacao)
)

CREATE TABLE Equipamento (


idEquipamento INT NOT NULL,
data_aquisicao SMALLDATETIME NOT NULL,
nome_equip VARCHAR(50) NOT NULL,
fabricante_equip VARCHAR(50) NOT NULL,
CHECK(idEquipamento>0),
PRIMARY KEY(idEquipamento)
)

-- Criação das tabelas dos Relacionamentos

CREATE TABLE Reparacao (


desc_reparacao VARCHAR(50) NOT NULL,
mec_responsavel VARCHAR(50) NOT NULL,
data_reparacao SMALLDATETIME NOT NULL,
id_mec INT NOT NULL,
idEquipamento INT NOT NULL,
PRIMARY KEY(data_reparacao,id_mec,idEquipamento),
FOREIGN KEY(id_mec) REFERENCES Mecanico(id_mec),
FOREIGN KEY(idEquipamento) REFERENCES Equipamento(idEquipamento)
)

CREATE TABLE Verificacao (


data_verificacao VARCHAR(50) NOT NULL,
desc_verificacao VARCHAR(50) NOT NULL,
mec_responsavel VARCHAR(50) NOT NULL,
id_mec INT NOT NULL,
idEquipamento INT NOT NULL,
PRIMARY KEY(desc_verificacao,id_mec,idEquipamento),
FOREIGN KEY(id_mec) REFERENCES Mecanico(id_mec),
FOREIGN KEY(idEquipamento) REFERENCES Equipamento(idEquipamento)
)

CREATE TABLE Associado (


idCat INT NOT NULL,
idEquipamento INT NOT NULL,
PRIMARY KEY(idCat,idEquipamento)
FOREIGN KEY(idCat) REFERENCES Categoria(idCat),
FOREIGN KEY(idEquipamento) REFERENCES Equipamento(idEquipamento)
)

CREATE TABLE Pertence (


id_estacao INT NOT NULL,
idEquipamento INT NOT NULL,
PRIMARY KEY(id_estacao,idEquipamento),
FOREIGN KEY(id_estacao) REFERENCES Estacao(id_estacao),
FOREIGN KEY(idEquipamento) REFERENCES Equipamento(idEquipamento)
)

3. Considere o seguinte diagrama relacional de uma base de dados de um catálogo de nomeação e 
atribuição de oscares: 

3.1. Escreva  questões   em   linguagem   SQL   que   responda   a   cada   uma   das   seguintes   perguntas: 
NOTA: Entre parêntesis rectos encontram­se os dados que se pretende obter com cada questão.

3.1.1.  Quais os filmes registados no sistema? [informação completa dos filmes]

SELECT * FROM Filme

3.1.2.  Quais os filmes nomeados para Óscares em 2007? [informação completa dos filmes]

SELECT * FROM Filme F, Nomeacao N
WHERE F.idFilme=N.idFilme AND
               N.ano=2007
3.1.3.  Quantas categorias existem registadas no sistema? [número de categorias] 

SELECT COUNT(*) AS contador_categorias FROM Categoria

3.1.4.  Quantos filmes distintos ganharam Óscares em 2007? [número de filmes] 

SELECT COUNT(DISTINCT titulo)
FROM Filme F, Nomeacao N
WHERE N.ano=2007 AND
               N.idFilme=F.idFilme

3.1.5. Qual o filme tipo “Drama” foi venceu na categoria de “Melhor Filme” no ano de 2003? [titulo]

SELECT titulo FROM Filme F, Nomeacao N, Categoria C, Tipo T, TipoFilme X
WHERE N.ano=2003 AND
               T.tipo=’Drama’ AND
               C.nome=’Melhor Filme’ AND
               C.idCategoria=N.idCategoria AND
               N.idFilme=F.idFilme AND
               F.idFilme=X.idFilme AND
               X.idTipo = T.idTipo

Na próxima pergunta…
(não tinha espaço na página seguinte :D )
3.2 Considere que foi executado o seguinte comando em linguagem SQL:

ALTER TABLE Filme ADD n_nomeacoes INT 

3.2.1.  Desenvolva   um   procedimento   que   receba   como   parâmetro   os   dados   necessários   para   o 
registo de uma nomeação e insira um novo registo na tabela Nomeacao. Tenha em atenção que o 
n_nomeacoes  na   tabela   Filme   deve   ser   actualizado   automaticamente   com   o   número   actual   de 
nomeações existentes para esse filme. NOTA – Crie dois procedimentos auxiliares: um para devolver 
o número de nomeações de um filme, e outro para actualizar esse número. 

CREATE PROCEDURE InsereRegisto @idNomeacao INTEGER, @ano INTEGER,


@oscar VARCHAR(50), @idCategoria
INTEGER,
@idFilme INTEGER AS

INSERT INTO Nomeacoes(idNomeacao, ano, oscar, idCategoria, idFilme)


VALUES (@idNomeacao, @ano, @oscar, @idCategoria, @idFilme)

-- Vamos actualizar a tabela Filme mas para isso é preciso recontar nomeaçoes
EXECUTE Conta_Nomeacoes @idFilme

-- Agora sim procedemos à actualização


EXECUTE Actualiza_NomeacoesMais1 @idDocente

GO

Procedimento Auxiliar 1

CREATE PROCEDURE Conta_Nomeacoes @idFilme INTEGER AS

RETURN( SELECT COUNT(*) FROM Filme F, Nomeacoes N


WHERE F.idFilme=N.idFilme AND
F.idFilme=@idFilme
GO

Procedimento Auxiliar 2

CREATE PROCEDURE Actualiza_NomeacoesMais1 @idFilme INTEGER AS

DECLARE @n_nomeacoes1 INTEGER


EXECUTE @n_nomeacoes1=Conta_Nomeacoes @idFilme
UPDATE Filme

-- De notar que se soma 1 valor à contagem. Devido à inserção de dados novos!


SET n_nomeacoes=@n_nomeacoes1 + 1
WHERE idFilme=@idFilme
GO
3.2.2.  Implemente o mesmo comportamento descrito na questão anterior (3.2.1) usando um trigger.

CREATE TRIGGER Adiciona_Entrada ON Nomeacao


AFTER INSERT
AS DECLARE @idNomeacao INTEGER,
@ano INTEGER,
@oscar VARCHAR(50),
@idCategoria INTEGER,
@idFilme INTEGER

SELECT @idNomeacao= idNomeacao,


@ano=ano,
@oscar=oscar,
@idCategoria=idCategoria,
@idFilme=idFilme

FROM INSERTED

UPDATE Filme

-- Contagem das nomeacoes que esse Filme já tinha associados ao seu id

EXECUTE Conta_nomeacoes @idFilme

-- Actualizar esse valor na tabela! Mas não esquecer que entretanto já foi adicionado
outra nomeacao!

EXECUTE Actualiza_NomeacoesMais1 @idFilme

GO

Como podem reparar a resolução é sempre a mesma … só é preciso prática e mais prática para se 
fazerem as coisas de gás… 

Você também pode gostar