Вы находитесь на странице: 1из 42

U F S C

R P P

Grupo 01 - Loja de Discos


F F

Breno Vinicius Viana de Oliveira - 726498


Gabriel Rodrigues Rocha - 726518
Henrique Shinki Kodama - 726537

supervisionado por
Profa. Dra. Sahudy Montenegro González

9 de dezembro de 2017
Sumário

1 Especificação do Problema e dos Requisitos de Dados 4


1.1 Objetivos do Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Descrição dos Requisitos de Dados . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Projeto Conceitual 7

3 Projeto Lógico 9
3.1 Descrição do Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Esquema e Normalização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

4 Projeto Físico 13
4.1 Criação e alimentação do banco de dados . . . . . . . . . . . . . . . . . . . . . 13
4.2 Consultas em Álgebra Relacional e SQL . . . . . . . . . . . . . . . . . . . . . . 13
4.3 Proposta e Implementação de um trigger . . . . . . . . . . . . . . . . . . . . . 16

5 Considerações finais 17

Referências Bibliográficas 18

Apêndices 19

Apêndice A Código da criação do banco de dados 20

Apêndice B Código da alimentação do banco de dados 22


B.1 Álbuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
B.2 Bandas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
B.3 Gravadoras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
B.4 Versões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
B.5 Gravações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
B.6 Contratos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Apêndice C Código das consultas em SQL 36

Apêndice D Código do trigger em SQL 41

1
Lista de Figuras

2.1 DER da modelagem do problema . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.1 Notação diagramática das dependências funcionais . . . . . . . . . . . . . . . 11


3.2 Diagrama referente ao esquema relacional . . . . . . . . . . . . . . . . . . . . 12

2
Lista de Tabelas

2.1 Tipos de atributos por tipo-entidade do MER. . . . . . . . . . . . . . . . . . . . 7

3
1 Especificação do Problema e dos Requisitos de Dados

Uma loja de discos chamada Sahudyscos necessita de um sistema de controle de esto-


que, a fim de registrar a entrada e saída de discos. Para realizar tal controle, propõe-se a
construção de um banco de dados associado a um sistema de gestão de banco de dados.
O presente trabalho almeja registrar a modelagem e implementação do sistema de banco
de dados cujo mini-mundo compreende as entidades e relações no contexto da loja de discos
em questão. O problema associado a tal modelagem, por sua vez, consiste em construir
uma forma de armazenar, manter e consultar dados referentes a produtos musicais na loja.
A modelagem descrita a seguir identifica quatro tipo-entidades diferentes (álbum, versão de
álbum, banda e gravadora) e seus tipo-relações.
A modelagem é realizada com base nas técnicas descritas por Elmasri and Navathe
[1999] e Heuser [2009], este último sendo a base para as especificações do projeto concei-
tual e diagrama entidade-relacionamento.
A loja lida primariamente com o álbum musical, o qual possui um nome, uma capa, uma
data de publicação original, um código de identificação, um país de publicação, um ou mais
gêneros musicais, uma descrição, uma avaliação (número decimal de zero a cinco). Um
álbum musical é gravado por uma ou mais bandas e, no caso de coletâneas, convenciona-
se que a banda que publicou o álbum é denotada por “Vários Artistas” ou “VA”.
Os produtos vendidos pela loja são, na verdade, versões de álbuns musicais. Cada ver-
são de um álbum possui um código de barras, uma data de publicação, o formato de publica-
ção, um identificador de tipo de versão (original, remasterização ou versão de aniversário),
um preço, as quantidades vendidas e disponíveis na loja, e um indicador de promoção. Tanto
as quantidades disponíveis, vendidas e a indicação de promoção são atributos que podem
ser alterados semanalmente (consequentemente o preço também). Dessa forma, é possível
inferir qual o valor total arrecadado semanalmente na loja, pois todos os preços e quantida-
des estarão atualizadas conforme a semana corrente, além de possibilitar a loja de pedir
novos produtos para a semana seguinte à corrente. Cada álbum musical é publicado por
uma gravadora, sendo que diferentes versões do álbum podem ser publicados por gravado-
ras diferentes da original em diferentes instâncias, determinadas pela data de lançamento.
Cada gravadora, por sua vez, possui um nome, um código de identificação, uma data
de fundação, um ou mais gêneros de atuação, um email e um ou mais telefones. Uma
gravadora lança um ou mais álbuns musicais. Uma gravadora é contratada por uma ou mais
bandas. É importante saber quais bandas contratam quais gravadoras para que se possa
solicitar mais discos no caso de escassez.
Cada banda possui um nome, um código de identificação sintético, um ou mais gêneros
em que atua ou atuou e uma descrição. Uma banda gravou um ou mais álbuns e contratou
uma ou mais gravadoras. Bandas não auto-publicam, logo os contratos que uma determi-
nada banda tem são exclusivamente com gravadoras.

1.1 Objetivos do Sistema

O objetivo principal do sistema é controlar os estoques de discos, melhorar o controle


de vendas e promoções, aumentar a eficiência de pesquisa tanto para a loja quanto para
os clientes, e melhorar a catalogação. Com o sistema, busca-se acelerar o processo de

4
atendimento e melhorar a organização da loja como um todo.
O sistema deve permitir a realização de consultas e atualizações através da CLI (Com-
mand Line Interface) do software PostgreSQL Stinson [2001], escolhido para implementação
deste projeto.
1.2 Descrição dos Requisitos de Dados

A partir da descrição do mini-mundo, é possível inferir requisitos de dados ou consultas


que o sistema deve ser capaz de realizar. Foram identificados dez requisitos de dados para
o problema em questão. Três dos dez requisitos de dados retornam atributos calculados,
enquanto os outros retornam atributos armazenados. Os requisitos de dados que utilizam
Promocao como atributo de busca verificam se este é verdadeiro ou falso para uma dada
versão de álbum.
Os requisitos de dados do sistema são:

1. Listar todos os álbuns de determinada banda.

• Atributos de visualização do resultado: Cod_album, Nome, Descricao


• Atributos de busca: Cod_banda

2. Listar todos os álbuns determinada gravadora.

• Atributos de visualização do resultado: Cod_album, Nome, Descricao


• Atributos de busca: Cod_gravadora

3. Retornar a versão de álbum com o maior ou menor preço de determinada banda.

• Atributos de visualização do resultado: Cod_barras, Nome, Preco


• Atributos de busca: Cod_banda

4. Retornar versões de um determinado álbum que estão em promoção na semana cor-


rente.

• Atributos de visualização do resultado: Cod_barras, Preco


• Atributos de busca: Cod_album, Promocao

5. Informar versões de um álbum cujas quantidades disponíveis estão abaixo de uma


certa quantidade mínima.

• Atributos de visualização do resultado: Cod_barras, Preco


• Atributos de busca: Cod_album, Qtd_minima (fornecido)

6. Listar álbuns por determinado gênero.

• Atributos de visualização do resultado: Cod_album, Nome


• Atributos de busca: Genero

7. Informar a quantidade de vendas de versões de álbuns por gravadora.

• Atributos de visualização do resultado: Num_total (calculado)

5
• Atributos de busca: Nenhum

8. Informar a avaliação média de cada banda.

• Atributos de visualização do resultado: Aval_media (calculado)


• Atributos de busca: Nenhum

9. Retornar versões de álbuns de determinada banda conforme o tipo desejado.

• Atributos de visualização do resultado: Cod_barras, Nome, Preco


• Atributos de busca: Cod_banda, Tipo_versao

10. Recuperar álbuns publicados em determinada faixa temporal.

• Atributos de visualização do resultado: Cod_album, Nome, Descricao


• Atributos de busca: Data

6
2 Projeto Conceitual

Esta seção apresenta dois elementos necessários para a modelagem conceitual: a ta-
bela de atributos dos tipo-entidades e o diagrama entidade-relacionamento (DER). A Tabela
2.1 resume os atributos dos tipo-entidades do problema, descrevendo também seus tipos e
restrições. A Figura 2.1 contém o diagrama entidade-relacionamento, o qual identifica, além
dos atributos dos tipo-entidades, os tipo-relações entre os tipo-entidades e atributos ineren-
tes a estes. Ambos elementos foram construídos de forma a refletir o mini-mundo descrito
na Seção 1.
Tipo-Entidade Atributo Tipo Restrição
Album Cod_album Monovalorado, simples, identificador Obrigatório
Nome Monovalorado, simples Obrigatório
Capa Monovalorado, simples Opcional
1889 <= data.ano <= ano atual e obrigatório,
Data_publicacao Monovalorado, composto
1 <= data.dia <= 31 e 1 <= data.mes <= 12 opcionais
Pais Monovalorado, simples Obrigatório
Genero Multivalorado, simples Obrigatório
Descricao Monovalorado, simples 1 <= descricao.size <= 200, opcional
Avaliacao Monovalorado, simples 0 <= avaliacao <= 5, opcional
Versao Cod_barras Monovalorado, simples, ident. parcial Obrigatório
Formato Monovalorado, simples ”vinil”, ”cassete”ou ”cd”
Tipo_versao Monovalorado, simples ”original”, ”remasterizada”ou ”aniversario”
Preco Monovalorado, simples preco >0, obrigatório
Qtd_vendida Monovalorado, simples qtd_vendida >= 0, obrigatório
Qtd_disponivel Monovalorado, simples qtd_disponivel >= 0, obrigatório
Promocao Monovalorado, simples Booleano, obrigatório
Gravadora Nome Monovalorado, simples Obrigatório
Cod_identificacao Monovalorado, simples, identificador Obrigatório
Data_fundacao Monovalorado, composto data <= 2017
Genero Multivalorado, simples Obrigatório
email é ”x@y.{z}”, em que x e y são cadeias de
E-mail Monovalorado, simples
caracteres alfanuméricos e z é um grupo de domínios
telefone é ”XXYYZZZZZZZZ”,
Telefone Multivalorado, simples
em que X, Y e Z são números
Banda Cod_banda Monovalorado, simples, identificador Obrigatório
Nome Monovalorado, simples Obrigatório
Data_fundacao Monovalorado, composto data <= 2017
Genero Multivalorado, simples Obrigatório
Descricao Monovalorado, simples Opcional

Tabela 2.1: Tipos de atributos por tipo-entidade do MER.

7
Figura 2.1: DER da modelagem do problema

Os atributos Cod_banda, Cod_identificacao, Nome e Genero conforme presentes


no DER da Figura 2.1 não introduzem redundância no modelo por dois motivos:

1. Nenhuma banda pode auto-publicar, logo necessariamente Nome, Cod_banda e


Cod_identificacao são atributos canonicamente diferentes;

2. Uma banda pode atuar em gêneros diferentes da gravadora que contratou. Por exem-
plo, a gravadora Virgin Records atualmente atua nos gêneros Pop e Pop-rock, porém
tem contratos com bandas de diversos gêneros, como Jamiroquai (gêneros Pop-funk
Acid-jazz) e Genesis (gênero Prog-rock).

8
3 Projeto Lógico

Esta seção descreve o mapeamento do modelo entidade-relacionamento para o modelo


relacional, conforme descrito em Codd [1970]. O objetivo do mapeamento é transformar
todas as informações descritas na Seção 2 em tuplas agrupadas por relações (ou tabelas),
sobre as quais seja possível realizar as consultas descritas na Seção 1.

3.1 Descrição do Mapeamento

A primeira decisão de projeto trata do mapeamento de tipo-entidades fortes. Conforme


a Figura 2.1, os tipo-entidades fortes são Álbum, Banda e Gravadora. Para cada tipo-
entidade, será criada uma tabela contendo seus respectivos atributos transformados em
chaves, sendo os atributos identificadores as suas chaves primárias.
A segunda decisão a ser tomada deve ser a forma de eliminar os atributos multivalorados,
pois eles não estão dentro do modelo relacional [Codd, 1990]. Neste projeto, os atributos
Genero dos tipo-entidades Album, Banda e Gravadora e Telefone de Gravadora são
multivalorados. Optou-se por limitar o número de valores distintos para o atributo, para mini-
mizar o número de junções na realização de consultas. Convencionou-se que Album, Banda
e Gravadora podem ter no máximo dois valores distintos para seus atributos Genero e
Gravadora pode ter no máximo dois Telefones distintos.
A terceira decisão traz à tona a questão de tipo-entidades fracos. Há um tipo-entidade
fraco no projeto conceitual, Versão. Será criada uma tabela para esse tipo-entidade con-
tendo todos os seus atributos, transformados em chaves. Adicionalmente, Versão terá o
atributo Cod_album do tipo-entidade Álbum. A chave primária de Versão será a tupla
{Cod_barras, Cod_album}, sendo que Cod_album é uma chave estrangeira que referen-
cia a tabela de Album.
A quarta decisão diz respeito aos tipo-relacionamentos de cardinalidade 1:N. Consul-
tando a Figura 2.1, há dois tipo-relacionamentos de cardinalidade 1:N - contém e publica.
Há duas possíveis decisões: adição de uma nova coluna na tabela referente a Versao
ou criar uma nova tabela para o tipo-relacionamento em questão. Na verdade, o tipo-
relacionamento contém já foi mapeado na terceira decisão, pois implicitamente a inser-
ção do atributo Cod_album adicionou uma nova coluna na tabela de Versão. O tipo-
relacionamento publica também será mapeado através da adição de novas colunas: na
tabela de Versão serão adicionadas novas colunas cujas chaves contém os valores dos atri-
butos Data e Cod_identificacao, sendo Cod_identificacao uma chave estrangeira
que referencia a tabela Gravadora. A abordagem de adição de novas colunas não introduz,
neste caso, possíveis valores nulos pois ambos os tipos-relacionamentos têm participação
total.
A quinta decisão trata do mapeamento de tipo-relacionamentos de cardinalidade N:N. Os
tipo-relacionamentos de cardinalidade N:N são contrata e grava. Nesse caso, os tipo-
relacionamentos são mapeados através da criação de tabelas próprias, contendo os atribu-
tos do próprio tipo-relação como chaves e as chaves primárias dos tipo-entidades a quais
se ligam (e referem), cuja união resulta na chave primária da tabela do tipo-relacionamento.
Logo, o tipo-relacionamento grava terá a tupla {Cod_album, Cod_banda} como chave pri-
mária e contrata terá a tupla {Cod_identificacao, Cod_banda} como chave primária.

9
3.2 Esquema e Normalização

Após tomar as decisões, é possível sintetizar um esquema de banco de dados relacio-


nal e realizar a normalização do mesmo, caso necessário. A normalização será realizada
conforme os métodos descritos em Elmasri and Navathe [1999].
O esquema relacional gerado encontra-se a seguir:

• Album = {Cod_album, Nome, Pais, Descricao, Avaliacao, Capa,


Dia_publicacao, Mes_publicacao, Ano_publicacao, Genero1,
Genero2}

• Banda = {Cod_banda, Nome, Data_fundacao, Descricao, Genero1,


Genero2}

• Gravadora = {Cod_identificacao, Nome, E-mail, Data_fundacao,


Genero1, Genero2, Telefone1, Telefone2}

• Versao = {Cod_barras, Cod_album, Cod_gravadora, Formato,


Tipo_versao, Preco, Qtd_vendida, Qtd_disponivel, Promocao,
Dia_lancamento, Mes_lancamento, Ano_lancamento}
Cod_album referencia Album
Cod_gravadora referencia Gravadora

• Gravacao = {Cod_album, Cod_banda}


Cod_album referencia Album
Cod_banda referencia Banda

• Contrato = {Cod_banda, Cod_gravadora}


Cod_banda referencia Banda
Cod_gravadora referencia Gravadora

10
As dependências funcionais associadas ao esquema relacional são as seguintes:
11

Figura 3.1: Notação diagramática das dependências funcionais


O esquema relacional também pode ser visualizado e descrito diagramaticamente, con-
forme a seguir:

Figura 3.2: Diagrama referente ao esquema relacional

A transformação entre modelos foi realizada manualmente, sem auxílio de ferramentas


e atende a 3FN, uma vez que atributos multivalorados, Genero e Telefone, foram trata-
dos na decisão 2, substituídos por 2 valores para cada atributo, logo todos valores dentre
as relações são atômicos ou monovalorados. Adicionalmente, não se têm dependências
funcionais parciais e nem dependências funcionais transitivas.

12
4 Projeto Físico

A implementação do projeto foi feita na linguagem do sistema de gerenciamento de


banco de dados PostgreSQL, conforme especificado pelo usuário e mencionado na seção
1. Houve uma continuação do processo de mapeamento entre modelos e deu-se uma adap-
tação quase direta dos esquemas gerados para cada tipo-entidade na seção 3, levando em
consideração as restrições de domínio e impondo regras sobre as operações de inserção,
remoção e atualizações para garantir a consistência dos dados. As consultas foram des-
critas na linguagem da Álgebra Relacional de Codd [1970], almejando traduzir o significado
dos requisitos de dados descritos na seção 1, e posteriormente foram mapeados para a SQL
e encapsulados em procedimentos para facilitar o uso.

4.1 Criação e alimentação do banco de dados

O código que contém a criação das tabelas do banco de dados deste projeto encontra-se
no apêndice A. Os seis esquemas gerados na seção 3 foram mapeados para seis tabelas
de mesmo nome utilizando a sintaxe do PostgreSQL. Optou-se por utilizar atributos do tipo
serial para as tabelas album, banda e gravadora para que não houvesse preocupação
com a geração de chaves primárias para tuplas dessas tabelas. Como o tipo serial impõe,
por padrão, a possibilidade de uma gama de valores equivalente ao tipo bigint, as cha-
ves primárias e estrangeiras das outras tabelas (versao, gravacao e contrato) também
foram forçadas a utilizar o tipo bigint.
Em termos de restrições de domínio, os atributos das tabelas foram declaradas conforme
a tabela 2.1, com a adição de algumas outras restrições visando a escalabilidade do arma-
zenamento: a restrição de que todos os atributos que são cadeias de caracteres (exceto
atributos descricao de album e formato e tipo_versao de versao) foram limitados
a 40 caracteres; e os atributos telefone1 e telefone2 foram limitados a 15 caracteres,
conforme norma global.
As políticas de operações sobre o banco de dados foram definidas para todas as ta-
belas que possuem chaves estrangeiras: versao, gravacao e contrato. Em todos os
casos, convencionou-se que remoções e atualizações nas tabelas referenciadas implicam
em remoções e atualizados em cascata nas tabelas com referências.
O banco foi alimentado através dos scripts contidos no apêndice B conforme a ordem
descrita: primeiro foram inseridos os álbuns (B.1), bandas (B.2) e gravadoras (B.3) e pos-
teriormente as versões de álbuns (B.4), gravações (B.5) e contratos (B.6), para garantir a
integridade referencial do banco de dados. Os dados foram obtidos majoritariamente atra-
vés das próprias mídias físicas dos álbuns e por meio do site Discogs Lewandowski [2017],
logo representam dados condizentes com a vida real e não triviais.

4.2 Consultas em Álgebra Relacional e SQL

Os itens a seguir contém as fórmulas em Álgebra Relacional de cada requisito de dados


e referenciam os procedimentos de cada consulta, cujas definições estão no apêndice C.

1. Listar todos os álbuns de determinada banda.

13
• Atributos de visualização do resultado: Cod_album, Nome, Descricao
• Atributos de busca: Cod_banda
• AR:

t1 ← σCod_banda=⟨banda⟩ (Gravacao)
tf ← πCod_album,N ome,Descricao (t1 ▷◁ Album)

• Função em SQL: list_by_band

2. Listar todos os álbuns determinada gravadora.

• Atributos de visualização do resultado: Cod_album, Nome, Descricao


• Atributos de busca: Cod_gravadora
• AR:

t1 ← πCod_album (σCod_gravadora=⟨gravadora⟩ (V ersao))


tf ← πCod_album,N ome,Descricao (t1 ▷◁ Album)

• Função em SQL: list_by_label

3. Retornar a versão de álbum com o maior ou menor preço de determinada banda.

• Atributos de visualização do resultado: Cod_barras, Nome, Preco


• Atributos de busca: Cod_banda
• AR:
Maior preço:

t1 ← πCod_barras,Cod_album,P reco (σCod_banda=⟨banda⟩ (Gravacao) ▷◁ V ersao)


t2 (P reco) ← FMAX(P reco) (t1 )
tf ← πCod_barras,N ome,P reco (t2 ▷◁ t1 ▷◁ Album)

• Função em SQL: most_expensive_version Menor preço:

t1 ← πCod_barras,Cod_album,P reco (σCod_banda=⟨banda⟩ (Gravacao) ▷◁ V ersao)


t2 (P reco) ← FMIN(P reco) (t1 )
tf ← πCod_barras,N ome,P reco (t2 ▷◁ t1 ▷◁ Album)

• Função em SQL: cheapest_version

4. Retornar versões de um determinado álbum que estão em promoção na semana cor-


rente.

• Atributos de visualização do resultado: Cod_barras, Preco

14
• Atributos de busca: Cod_album, Promocao
• AR:

t1 ← (σCod_album=⟨album⟩ ∧ P romocao=TRUE (V ersao))


tf ← πCod_barras,P reco (t1 )

• Função em SQL: list_on_sale

5. Informar versões de um álbum cujas quantidades disponíveis estão abaixo de uma


certa quantidade mínima.

• Atributos de visualização do resultado: Cod_barras, Preco


• Atributos de busca: Cod_album, Qtd_minima (fornecido)
• AR:

t1 ← σCod_album=⟨album⟩ ∧ Qtd_disponivel<⟨Qtd_minima⟩ (V ersao)


tf ← πCod_barras,P reco (t1 )

• Função em SQL: list_low_stock

6. Listar álbuns por determinado gênero.

• Atributos de visualização do resultado: Cod_album, Nome


• Atributos de busca: Genero
• AR:

t1 ← σGenero1=⟨genero⟩ ∨ Genero2=⟨subgenero⟩ (Album)


tf ← πCod_album,N ome (t1 )

• Função em SQL: list_by_genre

7. Informar a quantidade de vendas de versões de álbuns por gravadora.

• Atributos de visualização do resultado: Num_total (calculado)


• Atributos de busca: Nenhum
• AR:

tf (Cod_gravadora, Qtd_total) ← Cod_gravadora FSUM(Qtd_vendida) (V ersao)

• Função em SQL: sales_by_label

8. Informar a avaliação média de cada banda.

• Atributos de visualização do resultado: Aval_media (calculado)


• Atributos de busca: Nenhum
• AR:

tf (Cod_banda, Aval_media) ← Cod_banda FAVG(Avaliacao) (Gravacao ▷◁ Album)

15
• Função em SQL: avg_rating_band

9. Retornar versões de álbuns de determinada banda conforme o tipo desejado.

• Atributos de visualização do resultado: Cod_barras, Nome, Preco


• Atributos de busca: Cod_banda, Tipo_versao
• AR:

t1 ← πCod_album (σCod_banda=⟨banda⟩ (Gravacao))


t2 ← πCod_album,N ome (t1 ▷◁ Album)
tf ← πCod_barras,N ome,P reco (σT ipo_versao=⟨versao⟩ (V ersao ▷◁ t2 ))

• Função em SQL: get_by_type

10. Recuperar álbuns publicados em determinada faixa temporal.

• Atributos de visualização do resultado: Cod_album, Nome, Descricao


• Atributos de busca: Data
• AR:

tf ← πCod_album,N ome,P reco (σData_publicacao ≥ ⟨data_inicio⟩ ∧ Data_publicacao ≤ ⟨data_f im⟩ (Album))

• Função em SQL: get_by_period.

4.3 Proposta e Implementação de um trigger

A fim de proporcional uma forma automatizada de controle de estoque, é proposto um


trigger que faz uma verificação hierárquica da disponibilidade de versões de álbum no esto-
que:

1. Após uma atualização na tabela Versao, verifica-se se a quantidade disponível da


versão atualizada está abaixo de determinado valor;

2. Se sim, um aviso é exibido alertando o usuário e verifica-se se a quantidade disponível


de todas as versões do álbum atualizado está abaixo de certo valor;

3. Novamente, se sim, um aviso é exibido e então verifica-se a quantidade disponível


de todas as versões da gravadora em questão está insuficiente e uma mensagem é
exibida em caso positivo.

A implementação em si desse trigger encontra-se no apêndice D.

16
5 Considerações finais

O projeto consiste na criação de um banco de dados que uma loja de discos pode utilizar
para facilitar a sua organização e manutenção. A loja foi modelada de modo a ter quatro
tipo entidades, Banda, Álbum, Gravadora e Versão, na qual a loja vende versões de álbuns
musicais. O controle dentro do estabelecimento Sahudyscos torna-se notavelmente mais
fácil com a utilização do banco de dados quando comparado com trabalhadores que teriam
que, por exemplo, verificar o estoque de discos, realizar pedidos para aqueles que estives-
sem em falta, ou mesmo lembrar manualmente a uma lista bandas de determinado gênero
quando requisitado por um cliente.
Algumas limitações fundamentais do projeto incluem a inexistência de registro de faixas
dos álbuns, o fato de modificar o estado de uma versão de álbum em relação a promoção
precisar efetivamente de duas operações, a inexistência de controle de vendas (uma vez
que está fora do escopo) e a duplicação de alguns dados quando há versões originais à
venda. Embora este projeto tenha sido criado e desenvolvido especialmente para a loja em
questão, o modelo pode ser adaptado para outras finalidades e funções, sendo capaz de ser
utilizado, ou reaproveitado em outros projetos.

17
Referências Bibliográficas

E. F. Codd. A relational model of data for large shared data banks. Commun. ACM,
13(6):377–387, June 1970. ISSN 0001-0782. doi: 10.1145/362384.362685. URL
http://doi.acm.org/10.1145/362384.362685.

E. F. Codd. The Relational Model for Database Management: Version 2. Addison-Wesley


Longman Publishing Co., Inc., Boston, MA, USA, 1990. ISBN 0-201-14192-2.

Ramez A. Elmasri and Shankrant B. Navathe. Fundamentals of Database Systems. Addison-


Wesley Longman Publishing Co., Inc., Boston, MA, USA, 3rd edition, 1999. ISBN
0805317554.

C.A. Heuser. Projeto de banco de dados : Volume 4 da Série Livros didá-


ticos informática UFRGS. Bookman, 2009. ISBN 9788577804528. URL
https://books.google.com.br/books?id=UKtB7_MnWQMC.

Kevin Lewandowski. Discogs, 2017. URL https://www.discogs.com.

Barry Stinson. PostgreSQL Essential Reference. New Riders Publishing, Thousand Oaks,
CA, USA, 2001. ISBN 0735711216.

18
Apêndices

19
A Código da criação do banco de dados

1 CREATE TABLE album (


2 cod_album serial PRIMARY KEY,
3 nome varchar(40) NOT NULL,
4 pais varchar(40) NOT NULL,
5 descricao text,
6 avaliacao numeric,
7 capa text,
8 data_publicacao date NOT NULL CHECK ((data_publicacao >=
,→ '1889-01-01') AND (data_publicacao <= CURRENT_DATE)),
9 genero1 varchar(40) NOT NULL,
10 genero2 varchar(40)
11 );
12

13 CREATE TABLE banda (


14 cod_banda serial PRIMARY KEY,
15 nome varchar(40) NOT NULL,
16 data_fundacao date NOT NULL CHECK (data_fundacao <=
,→ CURRENT_DATE),
17 descricao text,
18 genero1 varchar(40) NOT NULL,
19 genero2 varchar(40)
20 );
21

22 CREATE TABLE gravadora (


23 cod_identificacao serial PRIMARY KEY,
24 nome varchar(40) NOT NULL,
25 email text NOT NULL CHECK (email LIKE '%@%.%'),
26 data_fundacao date NOT NULL CHECK (data_fundacao <=
,→ CURRENT_DATE),
27 genero1 varchar(40) NOT NULL,
28 genero2 varchar(40),
29 telefone1 varchar(15) NOT NULL CHECK (telefone1 LIKE
,→ '+%'),
30 telefone2 varchar(15) CHECK (telefone2 LIKE '+%')
31 );
32

33 CREATE TABLE versao (


34 cod_barras bigint NOT NULL,
35 cod_album bigint NOT NULL,
36 cod_gravadora bigint NOT NULL ,
37 formato varchar(15) NOT NULL CHECK (formato = 'vinil'
,→ OR formato = 'cassete' OR formato = 'cd'),

20
38 tipo_versao varchar(20) NOT NULL CHECK (tipo_versao =
,→ 'original' OR tipo_versao = 'remasterizada' OR tipo_versao
,→ = 'aniversário'),
39 preco numeric NOT NULL CHECK (preco >= 0),
40 qtd_vendida bigint NOT NULL CHECK (qtd_vendida >= 0),
41 qtd_disponivel bigint NOT NULL CHECK (qtd_disponivel >= 0),
42 promocao boolean NOT NULL,
43 data_lancamento date NOT NULL CHECK ((data_lancamento >=
,→ '1889-01-01') AND (data_lancamento <= CURRENT_DATE)),
44 PRIMARY KEY (cod_barras, cod_album),
45 FOREIGN KEY (cod_album) REFERENCES album(cod_album) ON UPDATE
,→ CASCADE ON DELETE CASCADE,
46 FOREIGN KEY (cod_gravadora) REFERENCES
,→ gravadora(cod_identificacao) ON UPDATE CASCADE ON DELETE
,→ CASCADE
47 );
48

49 CREATE TABLE gravacao (


50 cod_album bigint NOT NULL,
51 cod_banda bigint NOT NULL,
52 PRIMARY KEY (cod_album, cod_banda),
53 FOREIGN KEY (cod_album) REFERENCES album(cod_album) ON UPDATE
,→ CASCADE ON DELETE CASCADE,
54 FOREIGN KEY (cod_banda) REFERENCES banda(cod_banda) ON UPDATE
,→ CASCADE ON DELETE CASCADE
55 );
56

57 CREATE TABLE contrato (


58 cod_banda bigint NOT NULL,
59 cod_gravadora bigint NOT NULL,
60 PRIMARY KEY (cod_banda, cod_gravadora),
61 FOREIGN KEY (cod_banda) REFERENCES banda(cod_banda) ON UPDATE
,→ CASCADE ON DELETE CASCADE,
62 FOREIGN KEY (cod_gravadora) REFERENCES
,→ gravadora(cod_identificacao) ON UPDATE CASCADE ON DELETE
,→ CASCADE
63 );

21
B Código da alimentação do banco de dados

B.1 Álbuns

1 INSERT INTO album(nome, pais, descricao, avaliacao, capa,


,→ data_publicacao, genero1) VALUES
2 ('Concert By The Sea', 'US', 'Concert by the Sea is a live album by
,→ pianist Erroll Garner, released on Columbia Records in 1956. It
,→ sold over a million dollars worth of retail copies by 1958,
,→ thereby qualifying for gold record status by the definition of
,→ that time, but has never been acknowledged as such by the
,→ RIAA.', 4.07,
,→ 'https://img.discogs.com/_j_so4lZL7Gl60Y5mVOU3OsCgZI=/fit-in/600x600/filters:s
,→ '1956-10-13', 'Jazz');
3 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
4 ('Hot Rats', 'US', 'Hot Rats is the second solo album by Frank
,→ Zappa. This is the first Zappa album on which Dweezil has a
,→ credit. Both (he and the album) pretty much came into the world
,→ together.', 4.59,
,→ 'https://img.discogs.com/OK9dDmCAPSKb5E2mmbHEOhPT5n8=/fit-in/600x598/filters:s
,→ '1969-10-10', 'Jazz', 'Rock');
5 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
6 ('Sgt. Pepper''s Lonely Hearts Club Band', 'UK', 'Sgt. Pepper''s
,→ Lonely Hearts Club Band is the eighth studio album by English
,→ rock band the Beatles. Released on 26 May 1967 in the United
,→ Kingdom and 2 June 1967 in the United States, it was an
,→ immediate commercial and critical success, spending 27 weeks at
,→ the top of the UK albums chart and 15 weeks at number one in the
,→ US.', 4.65,
,→ 'https://img.discogs.com/5niM71_Gc3Zkk6VK4cRlpHpQRIY=/fit-in/600x590/filters:s
,→ '1967-05-26', 'Rock', 'Psychedelic');
7 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
8 ('The Piper At The Gates Of Dawn', 'UK', 'The Piper at the Gates of
,→ Dawn is the debut studio album by the English rock band Pink
,→ Floyd, and the only one made under founding member Syd
,→ Barrett''s leadership.', 4.48,
,→ 'https://img.discogs.com/GsJZAmJObvYmkqKuSjpFZcbuJHk=/fit-in/600x600/filters:s
,→ '1967-08-05', 'Rock', 'Psychedelic');
9 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES

22
10 ('Lulu', 'US', 'Lulu is a collaborative album between rock
,→ singer-songwriter Lou Reed and heavy metal band Metallica. It
,→ was released on October 31, 2011 by Warner Bros. in the U.S. and
,→ Vertigo elsewhere.', 3.42,
,→ 'https://img.discogs.com/mBDUnwvyoTKo5QyTIx08OeU7ffE=/fit-in/470x467/filters:s
,→ '2011-10-31', 'Rock', 'Avantgarde');
11 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
12 ('Minute By Minute', 'US', 'Minute by Minute is the eighth studio
,→ album by American rock band The Doobie Brothers, released in
,→ 1978. The album contains their biggest hit, the Grammy-winning
,→ "What a Fool Believes," which was co-written by Kenny Loggins
,→ and simultaneously released on his 1978 album Nightwatch.',
,→ 3.64,
,→ 'https://img.discogs.com/TZ71KMxLLVM5flj0Tq6LYYiykN4=/fit-in/600x596/filters:s
,→ '1978-12-1', 'Pop', 'Rock');
13 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
14 ('A Saucerful Of Secrets', 'UK', 'A Saucerful of Secrets is the
,→ second studio album by the English rock band Pink Floyd,
,→ released on 29 June 1968 by EMI Columbia in the United Kingdom
,→ and released on 27 July 1968 in the United States by Tower
,→ Records.', 4.31,
,→ 'https://img.discogs.com/-py05SBErqzDoi77TYbElzp1GAc=/fit-in/600x597/filters:s
,→ '1968-06-29', 'Rock', 'Psychedelic');
15 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
16 ('Ummagumma', 'UK', 'Ummagumma is the fourth album by the English
,→ rock band Pink Floyd. It is a double album and was released on 7
,→ November 1969 by Harvest Records in the United Kingdom and by
,→ Capitol Records internationally.', 4.11,
,→ 'https://img.discogs.com/z_UiAo4RrL0SQMBNr_4RKSy9Ogo=/fit-in/587x600/filters:s
,→ '1969-10-25', 'Rock', 'Psychedelic');
17 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
18 ('More', 'UK', 'More is the first full-length soundtrack album, and
,→ third studio album, by the English rock band Pink Floyd,
,→ released on 13 June 1969 in the United Kingdom by EMI Columbia
,→ and on 9 August 1969 by Tower Records a subsidiary label of
,→ Capitol Records in the United States as Original Motion Picture
,→ Soundtrack from the film More.', 4.06,
,→ 'https://img.discogs.com/YF7rneGUVTGM8kVo_xBhpa_2qS0=/fit-in/600x590/filters:s
,→ '1969-06-13', 'Rock', 'Psychedelic');
19 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES

23
20 ('Atom Heart Mother', 'UK', 'Atom Heart Mother is the fifth studio
,→ album by the English progressive rock band Pink Floyd. It was
,→ released by Harvest on 2 October 1970 in the UK, and by Capitol
,→ on 10 October 1970 in the US.', 4.25,
,→ 'https://img.discogs.com/lVSWqAipy64ZCi3zyS2b8tlMo2w=/fit-in/600x588/filters:s
,→ '1970-10-02', 'Rock', 'Psychedelic');
21 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
22 ('Meddle', 'UK', 'Meddle is the sixth studio album by English
,→ progressive rock group Pink Floyd, released on 31 October 1971
,→ by Harvest Records.', 4.5,
,→ 'https://img.discogs.com/p68Oz1NzpkEJGvGkAphL-q2xYaw=/fit-in/599x596/filters:s
,→ '1971-10-31', 'Rock', 'Progressive');
23 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
24 ('Obscured By Clouds', 'UK', 'Obscured by Clouds is the seventh
,→ studio album by the English progressive rock band Pink Floyd,
,→ based on their soundtrack for the French film La Vallée, by
,→ Barbet Schroeder.', 4.14,
,→ 'https://img.discogs.com/Hq2Mf3qSQLd7Jqo43G4b3V_sQwY=/fit-in/600x603/filters:s
,→ '1972-06-02', 'Rock', 'Progressive');
25 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
26 ('The Dark Side of the Moon', 'UK', 'The Dark Side of the Moon is
,→ the eighth album by English rock band Pink Floyd, released on 1
,→ March 1973 by Harvest Records.', 4.69,
,→ 'https://img.discogs.com/jKTmuxcsYe2TqcahU3QqVXJLssU=/fit-in/600x600/filters:s
,→ '1973-03-01', 'Rock', 'Progressive');
27 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
28 ('Wish You Were Here', 'UK', 'Wish You Were Here is the ninth
,→ studio album by English rock band Pink Floyd. It was released on
,→ 12 September 1975 by Harvest Records in the United Kingdom and a
,→ day later by Columbia Records in the United States. The album
,→ topped record charts in both regions.', 4.71,
,→ 'https://img.discogs.com/T4T7uNgiBmcrWP1pfv7BLjdB7u4=/fit-in/600x600/filters:s
,→ '1975-09-12', 'Rock', 'Progressive');
29 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
30 ('Animals', 'UK', 'Animals is the tenth studio album by English
,→ rock band Pink Floyd. It was first released on 23 January 1977
,→ by Harvest Records in the United Kingdom and by Columbia Records
,→ in the United States.', 4.53,
,→ 'https://img.discogs.com/vBQw6Y9FESBtF8PRIQuw7rPVwxU=/fit-in/600x599/filters:s
,→ '1977-01-23', 'Rock', 'Progressive');

24
31 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
32 ('The Wall', 'UK', 'The Wall is the eleventh album by English rock
,→ band Pink Floyd. It was first released as a double album on 30
,→ November 1979 by Harvest Records in the United Kingdom and by
,→ Columbia Records in the United States.', 4.58,
,→ 'https://img.discogs.com/p7KdhxY0C7HGtAnIl53OTN0BvV4=/fit-in/588x600/filters:s
,→ '1979-11-30', 'Rock', 'Progressive');
33 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
34 ('The Final Cut', 'UK', 'The Final Cut is the twelfth studio album
,→ by the English progressive rock band Pink Floyd, released on 21
,→ March 1983 by Harvest Records in the United Kingdom and on 2
,→ April by Columbia Records in the United States.', 4.04,
,→ 'https://img.discogs.com/TsykxRFCikEaoQoyMl146goWmVs=/fit-in/600x636/filters:s
,→ '1983-03-21', 'Rock', 'Progressive');
35 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
36 ('A Momentary Lapse of Reason', 'UK', 'A Momentary Lapse of Reason
,→ is the thirteenth studio album by English progressive rock band
,→ Pink Floyd, released in the UK and US on 7 September 1987, on
,→ the labels EMI and Columbia.', 4.08,
,→ 'https://img.discogs.com/KiMEZISsXb2mzKySkXZR3NCkcrg=/fit-in/600x595/filters:s
,→ '1987-09-07', 'Rock', 'Progressive');
37 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
38 ('The Division Bell', 'UK', 'The Division Bell is the fourteenth
,→ studio album by the English progressive rock band Pink Floyd,
,→ released on 28 March 1994 by EMI Records in the United Kingdom
,→ and on 4 April by Columbia Records in the United States.', 4.4,
,→ 'https://img.discogs.com/wekpZfFF3c1tZw9thcrCQfGI_2w=/fit-in/600x596/filters:s
,→ '1994-03-28', 'Rock', 'Progressive');
39 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
40 ('The Endless River', 'UK', 'The Endless River is the fifteenth and
,→ final studio album by the English rock band Pink Floyd. It was
,→ released on 7 November 2014 in Friday-release countries and on
,→ 10 November elsewhere by Parlophone Records in the United
,→ Kingdom and by Columbia Records in the United States.', 4.0,
,→ 'https://img.discogs.com/4ygmwLbcph6oMUugL5pxq0VDRhA=/fit-in/600x630/filters:s
,→ '2014-11-07', 'Rock', 'Progressive');
41 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES

25
42 ('American Idiot', 'UK', 'American Idiot is the seventh studio
,→ album by American rock band Green Day. Produced by Rob Cavallo,
,→ the album was released in the UK on September 20, 2004 and in
,→ the US on September 21, 2004 by Reprise Records', 3.5,
,→ 'https://images-na.ssl-images-amazon.com/images/I/51H6nwsp6QL.jpg',
,→ '2004-09-20', 'Pop', 'Punk');
43 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
44 ('Physical Graffiti', 'US', 'Physical Graffiti is the sixth studio
,→ album by the English rock band Led Zeppelin, released as a
,→ double album on 24 February 1975 by their newly founded imprint
,→ label Swan Song Records.', 4.8,
,→ 'https://upload.wikimedia.org/wikipedia/en/e/e3/Led_Zeppelin_-_Physical_Graffi
,→ '1975-02-24', 'Rock', 'Progressive');
45 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
46 ('Back in Black', 'Australia', 'Back in Black is the seventh studio
,→ album by Australian rock band AC/DC. Produced by Robert John
,→ "Mutt" Lange, the album was released on 25 July 1980 by Albert
,→ Productions and Atlantic Records.', 4.1,
,→ 'https://upload.wikimedia.org/wikipedia/pt/b/b6/Back_in_Black.jpg',
,→ '1980-07-25', 'Rock', 'Hard');
47 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
48 ('Still Not Getting Any...', 'Canada', 'Still Not Getting Any... is
,→ the second studio album by Canadian rock band Simple Plan. It
,→ was released on October 26, 2004 by Lava Records.', 3.7,
,→ 'https://upload.wikimedia.org/wikipedia/pt/1/12/StillNotGettingAny.jpg',
,→ '2004-10-26', 'Pop', 'Rock');
49 INSERT INTO album(nome, pais, descricao, avaliacao, capa,
,→ data_publicacao, genero1, genero2) VALUES
50 ('Ghost Stories', 'US', 'Ghost Stories is the sixth studio album by
,→ British rock band Coldplay. Co-produced by the band with Paul
,→ Epworth along with returning Mylo Xyloto producers Daniel Green
,→ and Rik Simpson, it was released by Parlophone on 16 May 2014.',
,→ 4.2,
,→ 'https://upload.wikimedia.org/wikipedia/en/8/8a/Coldplay_-_Ghost_Stories.png'
,→ '2014-05-16', 'Pop', 'Electronic');
51 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
52 ('Kill Em All', 'US', 4.52, '1983-01-01', 'Metal');
53 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
54 ('Ride The Lightning', 'US', 4.62, '1984-01-01', 'Metal');
55 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES

26
56 ('Master of Puppets', 'US', 4.63, '1986-01-01', 'Metal');
57 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
58 ('...And Justice For All', 'US', 4.47, '1988-01-01', 'Metal');
59 INSERT INTO album(nome, pais,descricao, avaliacao, data_publicacao,
,→ genero1) VALUES
60 ('Metallica', 'US','Released on 12 Aug, 1991 by Elektra Records,
,→ commonly known as.. the Black Album, it became the bands
,→ best-selling album, certified 16× platinum by Riaa in 2012, and
,→ has sold over 16.000.000 copies in the United States. The snake
,→ in the artwork as well as the track "Dont tread on me" were
,→ inspired by a historical American flag, The Gadsden flag, which
,→ was designed in 1775. The cover is almost black, James Hetfield
,→ said "It was a simple black cover and you had to listen to the
,→ music. You wouldn’t be distracted by a drawing on the front." It
,→ is the album that shifted the band from Thrash to Heavy, also it
,→ attracted people to Metal that had little or anything to do with
,→ Metallica or Metal before in their life; but also vice versa for
,→ many of the ones that did.', 4.35, '1984-08-12', 'Metal');
61 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
62 ('Live Shit: Binge & Purge', 'US', 4.59, '1993-01-01', 'Metal');
63 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
64 ('Load', 'US', 3.92, '1996-01-01', 'Metal');
65 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
66 ('Reload', 'US', 3.78, '1997-01-01', 'Metal');
67 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
68 ('S&M', 'US', 4.03, '1999-01-01', 'Metal');
69 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
70 ('St. Anger', 'US', 3.54, '2003-01-01', 'Metal');
71 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
72 ('Death Magnetic', 'US', 4.0, '2008-01-01', 'Metal');
73 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
74 ('Quebec Magnetic', 'US', 4.45, '2012-01-01', 'Metal');
75 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
76 ('Through The Never', 'US', 4.29, '2013-01-01', 'Metal');
77 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES

27
78 ('Liberté, Égalité, Fraternité, Metallica!', 'US', 4.16,
,→ '2016-01-01', 'Metal');
79 INSERT INTO album(nome, pais, avaliacao, data_publicacao, genero1)
,→ VALUES
80 ('Hardwired...To Self-Destruct', 'US', 4.31, '2016-01-01',
,→ 'Metal');

B.2 Bandas

1 INSERT INTO banda(nome, data_fundacao, descricao, genero1) VALUES


2 ('Erroll Garner', '1923-06-23', 'Erroll Louis Garner (June 15, 1923
,→ – January 2, 1977; some sources say b. 1921) was an American
,→ jazz pianist and composer known for his swing playing and
,→ ballads.', 'Jazz');
3 INSERT INTO banda(nome, data_fundacao, descricao, genero1,
,→ genero2) VALUES
4 ('Pink Floyd', '1965-01-01', 'Pink Floyd were an English rock band
,→ formed in London in 1965. They achieved international acclaim
,→ with their progressive and psychedelic music.', 'Progressive',
,→ 'Psychedelic');
5 INSERT INTO banda(nome, data_fundacao, descricao, genero1,
,→ genero2) VALUES
6 ('The Doobie Brothers', '1969-01-01', 'The Doobie Brothers are an
,→ American rock band from San Jose, California. The group has sold
,→ more than 40 million albums worldwide throughout its career. The
,→ band has been active for five decades, with their biggest
,→ success occurring in the 1970s.', 'Soul', 'Rock');
7 INSERT INTO banda(nome, data_fundacao, descricao, genero1,
,→ genero2) VALUES
8 ('The Beatles', '1960-01-01', 'The Beatles were an English rock
,→ band formed in Liverpool in 1960. With members John Lennon, Paul
,→ McCartney, George Harrison and Ringo Starr, they became widely
,→ regarded as the foremost and most influential act of the rock
,→ era.', 'Pop', 'Rock');
9 INSERT INTO banda(nome, data_fundacao, descricao, genero1,
,→ genero2) VALUES
10 ('Frank Zappa', '1940-12-21', 'Frank Vincent Zappa (December 21,
,→ 1940 – December 4, 1993) was an American musician, composer,
,→ activist and filmmaker. His work was characterized by
,→ nonconformity, free-form improvisation, sound experiments,
,→ musical virtuosity, and satire of American culture.',
,→ 'Experimental', 'Jazz');
11 INSERT INTO banda(nome, data_fundacao, descricao, genero1) VALUES

28
12 ('Metallica', '1981-01-01', 'Metallica is an American heavy metal
,→ band from Los Angeles, California. The band was formed in 1981
,→ by drummer Lars Ulrich and vocalist/guitarist James Hetfield.
,→ The band''s fast tempos, instrumentals and aggressive
,→ musicianship made them one of the founding "big four" bands of
,→ thrash metal, alongside Megadeth, Anthrax and Slayer.',
,→ 'Metal');
13 INSERT INTO banda(nome, data_fundacao, descricao, genero1, genero2)
,→ VALUES
14 ('Lou Reed', '1942-03-02', 'Lewis Allan Reed (March 2, 1942 –
,→ October 27, 2013) was an American musician, singer and
,→ songwriter. He was the guitarist, singer, and principal
,→ songwriter for the rock band the Velvet Underground, with a solo
,→ career that spanned five decades.', 'Rock', 'Experimental');
15 INSERT INTO banda(nome, data_fundacao, descricao, genero1, genero2)
,→ VALUES
16 ('Green Day', '1987-10-17', 'Green Day is an American punk rock
,→ band formed in 1986 by lead vocalist and guitarist Billie Joe
,→ Armstrong and bassist Mike Dirnt.', 'Punk', 'Rock');
17 INSERT INTO banda(nome, data_fundacao, descricao, genero1, genero2)
,→ VALUES
18 ('Led Zeppelin', '1968-10-04', 'Led Zeppelin were an English rock
,→ band formed in London in 1968. The group consisted of guitarist
,→ Jimmy Page, singer Robert Plant, bassist and keyboardist John
,→ Paul Jones, and drummer John Bonham.', 'Rock', 'Metal');
19 INSERT INTO banda(nome, data_fundacao, descricao, genero1, genero2)
,→ VALUES
20 ('AC/DC', '1973-12-31', 'AC/DC are an Australian rock band, formed
,→ in Sydney in 1973 by brothers Malcolm and Angus Young. A hard
,→ rock/blues rock band, they have also been considered a heavy
,→ metal band.', 'Rock', 'Metal');
21 INSERT INTO banda(nome, data_fundacao, descricao, genero1, genero2)
,→ VALUES
22 ('Simple Plan', '1999-09-10', 'Simple Plan is a Canadian rock band
,→ from Montreal, Quebec. Simple Plan''s style of music has been
,→ described as emo, pop punk, alternative rock, pop rock, punk
,→ rock, and power pop', 'Rock', 'Pop');
23 INSERT INTO banda(nome, data_fundacao, descricao, genero1, genero2)
,→ VALUES
24 ('Coldplay', '1996-09-23', 'Coldplay are a British rock band formed
,→ in 1996 by lead vocalist and keyboardist Chris Martin and lead
,→ guitarist Jonny Buckland at University College London (UCL).',
,→ 'Rock', 'Pop');

29
B.3 Gravadoras

1 INSERT INTO gravadora(nome, email, data_fundacao, genero1, genero2,


,→ telefone1) VALUES
2 ('Columbia', 'Columbia.Publicity@sonymusic.com', '1889-01-01',
,→ 'Pop', 'Jazz', '+552125595200');
3 INSERT INTO gravadora(nome, email, data_fundacao, genero1,
,→ telefone1) VALUES
4 ('Warner Bros. Records', 'fansupport@wbr.com', '1958-01-01',
,→ 'Rock', '+8188469090');
5 INSERT INTO gravadora(nome, email, data_fundacao, genero1,
,→ telefone1) VALUES
6 ('Bizarre Records', 'dead@label.com', '1968-01-01', 'Experimental',
,→ '+55000000');
7 INSERT INTO gravadora(nome, email, data_fundacao, genero1, genero2,
,→ telefone1) VALUES
8 ('Parlophone', 'keith.wozencroft@emimusic.com', '1896-01-01',
,→ 'Pop', 'Early', '+02076055000');
9 INSERT INTO gravadora(nome, email, data_fundacao, genero1, genero2,
,→ telefone1) VALUES
10 ('Harvest', 'contact@harvestrecords.com', '1969-01-01',
,→ 'Progressive', 'Indie', '+02076055000');
11 INSERT INTO gravadora(nome, email, data_fundacao, genero1, genero2,
,→ telefone1) VALUES
12 ('Megaforce Records', 'dead@label.com', '1982-01-01', 'Metal',
,→ 'Trash', '+2127418861');
13 INSERT INTO gravadora(nome, email, data_fundacao, genero1, genero2,
,→ telefone1) VALUES
14 ('Elektra Records', 'dead@label.com', '1950-12-01', 'Folk',
,→ 'Gospel', '+2127418861');
15 INSERT INTO gravadora(nome, email, data_fundacao, genero1, genero2,
,→ telefone1) VALUES
16 ('Vertigo Records', 'dead@label.com', '1969-01-01', 'Metal',
,→ 'J-Rock', '+2127418861');
17 INSERT INTO gravadora(nome, email, data_fundacao, genero1, genero2,
,→ telefone1) VALUES
18 ('Blackened Recordings', 'dead@label.com', '2012-01-01', 'Metal',
,→ 'Trash', '+2127418861');

B.4 Versões

1 INSERT INTO versao VALUES


2 (887680515648, 1, 1, 'vinil', 'original', 25.0, 5, 20, FALSE,
,→ '1956-10-13');
3 INSERT INTO versao VALUES

30
4 (509970405892, 1, 1, 'cd', 'remasterizada', 30.0, 0, 10, TRUE,
,→ '1998-01-01');
5 INSERT INTO versao VALUES
6 (093624953692, 5, 2, 'cd', 'original', 30.0, 20, 45, FALSE,
,→ '2011-10-31');
7 INSERT INTO versao VALUES
8 (082083054051, 2, 3, 'vinil', 'remasterizada', 70.0, 0, 15, FALSE,
,→ '1982-01-01');
9 INSERT INTO versao VALUES
10 (777746384400, 4, 1, 'cassete', 'remasterizada', 55.0, 3, 1, TRUE,
,→ '1994-01-01');
11 INSERT INTO versao VALUES
12 (066083075051, 6, 2, 'vinil', 'original', 15.0, 5, 5, FALSE,
,→ '1978-12-01');
13 INSERT INTO versao VALUES
14 (088069088046, 3, 4, 'vinil', 'original', 100.0, 1, 0, FALSE,
,→ '1967-05-26');
15 INSERT INTO versao VALUES
16 (089065088046, 7, 1, 'vinil', 'original', 70.0, 0, 3, FALSE,
,→ '1968-01-01');
17 INSERT INTO versao VALUES
18 (083072086076, 7, 5, 'vinil', 'remasterizada', 80.0, 1, 1, TRUE,
,→ '1974-01-01');
19 INSERT INTO versao VALUES
20 (049048067032, 8, 5, 'vinil', 'remasterizada', 120.0, 0, 0, FALSE,
,→ '1972-01-01');
21 INSERT INTO versao VALUES
22 (454736626271, 9, 5, 'vinil', 'aniversário', 55.0, 1, 5, TRUE,
,→ '1989-01-01');
23 INSERT INTO versao VALUES
24 (077774638623, 9, 5, 'cd', 'remasterizada', 80.0, 2, 1, FALSE,
,→ '1987-01-01');
25 INSERT INTO versao VALUES
26 (083072086076046, 10, 5, 'vinil', 'original', 60.0, 0, 0, FALSE,
,→ '1970-01-01');
27 INSERT INTO versao VALUES
28 (050060032050052, 11, 5, 'cassete', 'remasterizada', 80.0, 0, 1,
,→ FALSE, '1978-01-01');
29 INSERT INTO versao VALUES
30 (368746034200000, 11, 5, 'cd', 'remasterizada', 50.0, 0, 5, TRUE,
,→ '1988-01-01');
31 INSERT INTO versao VALUES
32 (083072083080032, 12, 5, 'vinil', 'original', 150.0, 0, 1, FALSE,
,→ '1972-06-03');
33 INSERT INTO versao VALUES

31
34 (083072086076032, 13, 5, 'vinil', 'original', 150.0, 1, 1, FALSE,
,→ '1973-01-01');
35 INSERT INTO versao VALUES
36 (083075080069045, 14, 5, 'cassete', 'original', 150.0, 0, 1, FALSE,
,→ '1975-01-01');
37 INSERT INTO versao VALUES
38 (053067032050054, 15, 5, 'cassete', 'original', 130.0, 2, 0, FALSE,
,→ '1977-01-01');
39 INSERT INTO versao VALUES
40 (087080067082045, 16, 4, 'vinil', 'remasterizada', 80.0, 0, 3,
,→ TRUE, '2014-01-29');
41 INSERT INTO versao VALUES
42 (032067075032052, 18, 1, 'cd', 'original', 60.0, 0, 5, FALSE,
,→ '1987-08-31');
43 INSERT INTO versao VALUES
44 (509974765812900, 19, 1, 'cd', 'original', 70.0, 1, 1, TRUE,
,→ '1994-01-01');
45 INSERT INTO versao VALUES
46 (888750078810000, 20, 1, 'vinil', 'original', 80.0, 10, 30, FALSE,
,→ '2014-01-01');
47 INSERT INTO versao VALUES
48 (189740034670000, 21, 2, 'cd', 'original', 55.0, 15, 40, FALSE,
,→ '2004-09-20');
49 INSERT INTO versao VALUES
50 (237847113580403, 21, 2, 'cd', 'aniversário', 80.0, 5, 20, FALSE,
,→ '2005-10-22');
51 INSERT INTO versao VALUES
52 (115487862100043, 22, 2, 'vinil', 'original', 140.0, 2, 5, FALSE,
,→ '1975-02-24');
53 INSERT INTO versao VALUES
54 (658431778950000, 23, 3, 'vinil', 'remasterizada', 70.0, 0, 2,
,→ FALSE, '1980-07-25');
55 INSERT INTO versao VALUES
56 (248764757003487, 24, 2, 'cd', 'aniversário', 40.0, 10, 10, TRUE,
,→ '2014-04-22');
57 INSERT INTO versao VALUES
58 (11887643480000, 25, 4, 'cd', 'original', 35.0, 5, 15, FALSE,
,→ '2014-05-16');
59 INSERT INTO versao VALUES
60 (077082073048054057, 26, 6, 'vinil', 'original', 325.75, 5, 20,
,→ FALSE, '1983-01-01');
61 INSERT INTO versao VALUES
62 (077082073055054057, 27, 6, 'vinil', 'original', 404.69, 5, 20,
,→ FALSE, '1984-01-01');
63 INSERT INTO versao VALUES

32
64 (05404805205105704504, 28, 7, 'vinil', 'original', 131.58, 5, 20,
,→ FALSE, '1986-02-21');
65 INSERT INTO versao VALUES
66 (05404805604905004504, 29, 7, 'vinil', 'original', 197.42, 5, 20,
,→ FALSE, '1988-09-06');
67 INSERT INTO versao VALUES
68 (05404904904905104505, 30, 7, 'cd', 'original', 6.78, 5, 20, FALSE,
,→ '1991-08-12');
69 INSERT INTO versao VALUES
70 (05404904904905104506, 31, 7, 'cassete', 'original', 45.67, 5, 20,
,→ FALSE, '1993-11-09');
71 INSERT INTO versao VALUES
72 (05404905705005104507, 32, 7, 'cd', 'original', 0.82, 5, 20, FALSE,
,→ '1996-05-04');
73 INSERT INTO versao VALUES
74 (05405004905005404508, 33, 7, 'cd', 'original', 4.94, 5, 20, FALSE,
,→ '1997-11-18');
75 INSERT INTO versao VALUES
76 (05405005205405104509, 34, 7, 'cd', 'original', 11.52, 5, 20,
,→ FALSE, '1999-11-23');
77 INSERT INTO versao VALUES
78 (05405005605305104510, 35, 8, 'vinil', 'original', 164.52, 5, 20,
,→ FALSE, '2003-01-01');
79 INSERT INTO versao VALUES
80 (00602517737266, 36, 8, 'vinil', 'original', 164.52, 5, 20, FALSE,
,→ '2008-09-09');
81 INSERT INTO versao VALUES
82 (0660760670750780680, 37, 9, 'cd', 'original', 26.29, 5, 20, FALSE,
,→ '2012-01-01');
83 INSERT INTO versao VALUES
84 (066076067075078068, 38, 9, 'cd', 'original', 26.29, 5, 20, FALSE,
,→ '2014-01-28');
85 INSERT INTO versao VALUES
86 (053052055056053055, 39, 9, 'cd', 'original', 26.29, 5, 20, FALSE,
,→ '2016-01-01');
87 INSERT INTO versao VALUES
88 (066076067075078068, 40, 9, 'cd', 'original', 26.29, 5, 20, FALSE,
,→ '2016-01-01');

B.5 Gravações

1 INSERT INTO gravacao VALUES


2 (1,1);
3 INSERT INTO gravacao VALUES
4 (2,5);
5 INSERT INTO gravacao VALUES

33
6 (3,4);
7 INSERT INTO gravacao VALUES
8 (4,2);
9 INSERT INTO gravacao VALUES
10 (5,6);
11 INSERT INTO gravacao VALUES
12 (5,7);
13 INSERT INTO gravacao VALUES
14 (6,3);
15 INSERT INTO gravacao VALUES
16 (7, 2);
17 INSERT INTO gravacao VALUES
18 (8, 2);
19 INSERT INTO gravacao VALUES
20 (9, 2);
21 INSERT INTO gravacao VALUES
22 (10, 2);
23 INSERT INTO gravacao VALUES
24 (11, 2);
25 INSERT INTO gravacao VALUES
26 (12, 2);
27 INSERT INTO gravacao VALUES
28 (13, 2);
29 INSERT INTO gravacao VALUES
30 (14, 2);
31 INSERT INTO gravacao VALUES
32 (15, 2);
33 INSERT INTO gravacao VALUES
34 (16, 2);
35 INSERT INTO gravacao VALUES
36 (17, 2);
37 INSERT INTO gravacao VALUES
38 (18, 2);
39 INSERT INTO gravacao VALUES
40 (19, 2);
41 INSERT INTO gravacao VALUES
42 (20, 2);
43 INSERT INTO gravacao VALUES
44 (21, 8);
45 INSERT INTO gravacao VALUES
46 (22, 9);
47 INSERT INTO gravacao VALUES
48 (23, 10);
49 INSERT INTO gravacao VALUES
50 (24, 11);
51 INSERT INTO gravacao VALUES

34
52 (25, 12);
53 INSERT INTO gravacao VALUES
54 (26, 6);
55 INSERT INTO gravacao VALUES
56 (27, 6);
57 INSERT INTO gravacao VALUES
58 (28, 6);
59 INSERT INTO gravacao VALUES
60 (29, 6);
61 INSERT INTO gravacao VALUES
62 (30, 6);
63 INSERT INTO gravacao VALUES
64 (31, 6);
65 INSERT INTO gravacao VALUES
66 (32, 6);
67 INSERT INTO gravacao VALUES
68 (33, 6);
69 INSERT INTO gravacao VALUES
70 (34, 6);
71 INSERT INTO gravacao VALUES
72 (35, 6);
73 INSERT INTO gravacao VALUES
74 (36, 6);
75 INSERT INTO gravacao VALUES
76 (37, 6);
77 INSERT INTO gravacao VALUES
78 (38, 6);
79 INSERT INTO gravacao VALUES
80 (39, 6);
81 INSERT INTO gravacao VALUES
82 (40, 6);

B.6 Contratos

1 INSERT INTO contrato VALUES


2 (6,2);
3 INSERT INTO contrato VALUES
4 (6,3);

35
C Código das consultas em SQL

1 --RD1: Listar todos os álbuns de determinada banda


2 CREATE OR REPLACE FUNCTION list_by_band(banda int) RETURNS
3 TABLE (
4 cod_album bigint,
5 nome varchar(40),
6 descricao text
7 )
8 AS
9 $func$
10 BEGIN
11 RETURN QUERY
12 SELECT tf.cod_album, tf.nome, tf.descricao FROM
13 ((SELECT gravacao.cod_album FROM gravacao WHERE cod_banda =
,→ banda) AS t1
14 NATURAL JOIN album) AS tf
15 ORDER BY tf.cod_album;
16 END
17 $func$ LANGUAGE plpgsql;
18

19 --RD2: Listar todos os álbuns determinada gravadora


20 CREATE OR REPLACE FUNCTION list_by_label(gravadora int) RETURNS
21 TABLE (
22 cod_album bigint,
23 nome varchar(40),
24 descricao text
25 )
26 AS
27 $func$
28 BEGIN
29 RETURN QUERY
30 SELECT tf.cod_album, tf.nome, tf.descricao FROM
31 ((SELECT versao.cod_album FROM
32 gravacao WHERE cod_gravadora = gravadora) AS t1
33 NATURAL JOIN album) AS tf
34 ORDER BY tf.cod_album;
35 END
36 $func$ LANGUAGE plpgsql;
37

38 --RD3.1: Retornar a versão de álbum com o maior preço de


,→ determinada banda
39

40 CREATE OR REPLACE FUNCTION most_expensive_version(banda int)


,→ RETURNS

36
41 TABLE (
42 cod_barras bigint,
43 nome varchar(40),
44 preco numeric
45 )
46 AS
47 $func$
48 BEGIN
49 RETURN QUERY
50 WITH t1 AS (SELECT versao.cod_barras, gravacao.cod_album,
,→ versao.preco FROM
51 gravacao NATURAL JOIN versao WHERE cod_banda =
,→ banda)
52 SELECT tf.cod_barras, tf.nome, tf.preco FROM
53 (t1 NATURAL JOIN album) AS tf
54 WHERE tf.preco = (SELECT MAX(t1.preco) FROM t1);
55 END
56 $func$ LANGUAGE plpgsql;
57

58 --RD3.2: Retornar a versão de álbum com o maior preço de


,→ determinada banda
59

60 CREATE OR REPLACE FUNCTION cheapest_version(banda int) RETURNS


61 TABLE (
62 cod_barras bigint,
63 nome varchar(40),
64 preco numeric
65 )
66 AS
67 $func$
68 BEGIN
69 RETURN QUERY
70 WITH t1 AS (SELECT versao.cod_barras, gravacao.cod_album,
,→ versao.preco FROM
71 gravacao NATURAL JOIN versao WHERE cod_banda =
,→ banda)
72 SELECT tf.cod_barras, tf.nome, tf.preco FROM
73 (t1 NATURAL JOIN album) AS tf
74 WHERE tf.preco = (SELECT MIN(t1.preco) FROM t1);
75 END
76 $func$ LANGUAGE plpgsql;
77

78 --RD4: Retornar versões de um determinado álbum que estão em


,→ promoção na semana corrente
79

80 CREATE OR REPLACE FUNCTION list_on_sale(album int) RETURNS

37
81 TABLE (
82 cod_barras bigint,
83 preco numeric
84 )
85 AS
86 $func$
87 BEGIN
88 RETURN QUERY
89 SELECT versao.cod_barras, versao.preco FROM
90 versao
91 WHERE cod_album = album AND promocao = TRUE;
92 END
93 $func$ LANGUAGE plpgsql;
94

95 --RD5: Informar versões de um álbum cujas quantidades disponíveis


,→ estão abaixo de uma certa quantidade mínima
96

97 CREATE OR REPLACE FUNCTION list_low_stock(album int, qtd_minima


,→ int) RETURNS
98 TABLE (
99 cod_barras bigint,
100 preco numeric
101 )
102 AS
103 $func$
104 BEGIN
105 RETURN QUERY
106 SELECT versao.cod_barras, versao.preco FROM
107 versao
108 WHERE qtd_disponivel <= qtd_minima AND versao.cod_album =
,→ album;
109 END
110 $func$ LANGUAGE plpgsql;
111

112 --RD6: Listar álbuns por determinado gênero


113

114 CREATE OR REPLACE FUNCTION list_by_genre(genero varchar(40),


,→ subgenero varchar(40)) RETURNS
115 TABLE (
116 cod_album int,
117 nome varchar(40)
118 )
119 AS
120 $func$
121 BEGIN
122 RETURN QUERY

38
123 SELECT album.cod_album, album.nome FROM
124 album
125 WHERE genero1 = genero OR genero2 = subgenero;
126 END
127 $func$ LANGUAGE plpgsql;
128

129 --RD7: Informar a quantidade de vendas de versões de álbuns por


,→ gravadora
130

131 CREATE OR REPLACE FUNCTION sales_by_label() RETURNS


132 TABLE (
133 cod_gravadora bigint,
134 qtd_total numeric
135 )
136 AS
137 $func$
138 BEGIN
139 RETURN QUERY
140 SELECT versao.cod_gravadora, sum(qtd_vendida) FROM
141 versao
142 GROUP BY versao.cod_gravadora
143 ORDER BY sum(qtd_vendida) DESC;
144 END
145 $func$ LANGUAGE plpgsql;
146

147 --RD8: Informar a avaliação média por banda


148

149 CREATE OR REPLACE FUNCTION avg_rating_band() RETURNS


150 TABLE (
151 cod_banda bigint,
152 media numeric
153 )
154 AS
155 $func$
156 BEGIN
157 RETURN QUERY
158 SELECT tf.cod_banda, AVG(tf.avaliacao) as media FROM
159 (album NATURAL JOIN gravacao) AS tf
160 GROUP BY tf.cod_banda
161 ORDER BY media DESC;
162 END
163 $func$ LANGUAGE plpgsql;
164

165 --RD9: Retornar versões de álbuns de determinada banda conforme o


,→ tipo desejado
166

39
167 CREATE OR REPLACE FUNCTION get_by_type(banda int, tipo varchar(40))
,→ RETURNS
168 TABLE (
169 cod_barras bigint,
170 nome varchar(40),
171 preco numeric
172 )
173 AS
174 $func$
175 BEGIN
176 RETURN QUERY
177 SELECT tf.cod_barras, tf.nome, tf.preco FROM
178 (versao
179 NATURAL JOIN (SELECT t1.cod_album, album.nome FROM
180 (SELECT cod_album FROM
181 gravacao
182 WHERE cod_banda = banda) as t1
183 NATURAL JOIN album) AS t2) AS tf
184 WHERE tf.tipo_versao = tipo;
185 END
186 $func$ LANGUAGE plpgsql;
187

188 --RD10: Recuperar álbuns publicados em determinada faixa temporal


189

190 CREATE OR REPLACE FUNCTION get_by_period(de date, ate date) RETURNS


191 TABLE (
192 cod_album int,
193 nome varchar(40),
194 descricao text
195 )
196 AS
197 $func$
198 BEGIN
199 RETURN QUERY
200 SELECT album.cod_album, album.nome, album.descricao FROM
201 album
202 WHERE data_publicacao >= de AND data_publicacao <= ate;
203 END
204 $func$ LANGUAGE plpgsql;

40
D Código do trigger em SQL

1 CREATE OR REPLACE FUNCTION warn_low_stock() RETURNS TRIGGER AS $$


2 BEGIN
3 IF NEW.qtd_disponivel < TG_ARGV[0]::bigint THEN
4 RAISE NOTICE 'Quantidade disponível da versão % abaixo do
,→ valor mínimo (% unidades).', NEW.cod_barras,
,→ TG_ARGV[0]::bigint;
5

6 IF (SELECT SUM(qtd_disponivel) FROM versao WHERE cod_album =


,→ NEW.cod_album GROUP BY cod_album) < TG_ARGV[1]::bigint
,→ THEN
7 RAISE NOTICE 'Quantidade disponível do álbum % (Cod. %)
,→ abaixo do valor mínimo (% unidades).',
8 (SELECT nome FROM album WHERE cod_album = NEW.cod_album),
,→ NEW.cod_album, TG_ARGV[1]::bigint;
9

10 IF (SELECT SUM(qtd_disponivel) FROM versao WHERE


,→ cod_gravadora = NEW.cod_gravadora GROUP BY
,→ cod_gravadora) < TG_ARGV[2]::bigint THEN
11 RAISE NOTICE 'Quantidade disponível da gravadora % (Cod.
,→ %) abaixo do valor mínimo (% unidades).',
12 (SELECT nome FROM gravadora WHERE cod_identificacao =
,→ NEW.cod_gravadora), NEW.cod_gravadora,
,→ TG_ARGV[2]::bigint;
13 END IF;
14

15 END IF;
16

17 END IF;
18 RETURN NEW;
19 END;
20 $$ LANGUAGE plpgsql;
21

22 CREATE TRIGGER warn_low_stock


23 BEFORE UPDATE ON versao
24 FOR EACH ROW EXECUTE PROCEDURE warn_low_stock(1, 5, 10);

41

Вам также может понравиться