Skip to content
Merged

Docs #29

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions docs/modulo1/MER_v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# Modelo Entidade Relacionamento
## Segunda Versão

## Entidades

* **CYBERLUTADOR**
* **NPC**
* **INIMIGO**
* **INSTANCIAINIMIGO**
* **MENTOR**
* **MOCHILA**
* **ITEM**
* **INSTANCIAITEM**
* **BIOCHIP**
* **IMPLANTE**
* **BRACOROBOTICO**
* **CAPACETENEURAL**
* **VISAOCIBERNETICA**
* **MERCADOCLANDESTINO**
* **MERCADOITEM**
* **MISSÃO**
* **RECOMPENSA MISSÃO**
* **SALA**
* **REGIÃO**
* **PUZZLE**
* **DIÁLOGO**
* **FACÇÃO**
* **CODEKEEPERS**
* **NETRUNNERS**
* **RECOMPENSA**

## Atributos

* **CYBERLUTADOR**: idCyberLutador, nomeCyberLutador, velocidade, vida, inteligência, furtividade, percepção, resistência, força
* **NPC**: <u>idNPC</u>
* **INIMIGO**: <u>idInimigo</u>, qtdDano, vida
* **MENTOR**: <u>idMentor</u>,aumentaInteligencia, aumentaFurtividade, aumentaPercepcao
* **MOCHILA**: <u>idMochila</u>, capacidade
* **ITEM**: <u>idItem</u>, nomeItem, valor, descricao
* **BIOCHIP** <u>idBiochip</u>, regeneraVida
* **IMPLANTE**: <u>idImplante</u>, nomeImplante, tipo
* **BRACOROBOTICO** <u>idBracorobotico</u>, aumentaForca, aumentaVeloc
* **CAPACETENEURAL** <u>CapaceteNeural</u>, aumentaInt, aumentaResis
* **VISAOCIBERNETICA** <u>idVisaocibernetica</u>, aumentaFurti, aumentaPercep
* **MERCADOCLANDESTINO**: <u>idMercadoClandestino</u>, nomeMercado, descricao
* **MISSÃO**: <u>idMissao</u>, nomeMissao, objetivo, progresso
* **SALA**: <u>idSala</u>, nomeSala
* **REGIÃO**: <u>idRegiao</u>, nomeRegiao
* **PUZZLE**: <u>idPuzzle</u>, nomePuzzle, dificuldade, resposta, estado
* **DIÁLOGO**: <u>idDialogo</u>, nomeDialogo, descricao, resposta
* **FACÇÃO**: <u>idFaccao</u>, nomeFaccao, ideologia
* **NETRUNNERS**: <u>idNetRunners</u>, aumentaInte, aumentaPercep
* **CODEKEEPERS**: <u>idCodeKeepers</u>, aumentaVelo, aumentaResis
* **RECOMPENSA**: <u>idRecompensa</u>, dinheiro, item



## Relacionamentos
<br>
CYBERLUTADOR - participa - MISSÃO <br>
* CYBERLUTADOR participa de zero ou várias MISSÕES (0,N) <br>
* MISSÃO tem a participação de um unico CYBERLUTADOR (1,1) <br>

CYBERLUTADOR - esta - SALA <br>
* Varios CYBERLUTADOR estão em varias SALAS (N,M) <br>
* SALA pode estar com zero ou varios CYBERLUTADOR (0,N) <br>

CYBERLUTADOR - participa - FACCAO <br>
* CYBERLUTADOR participa de uma unica FACÇÃO (1,1) <br>
* FACÇÃO tem a participação de zero ou vários CYBERLUTADOR (0,N) <br>

NPC - possui - DIALOGO <br>
* NPC possui zero ou vários DIALOGOS (0,N) <br>
* DIALOGO é possuido por um unico NPC (1,1) <br>

MERCADOCLANDESTINO - vende - ITEM <br>
* MERCADOCLANDESTINO vende um ou varios ITENS (1,N) <br>
* ITEM é vendido por zero ou varios MERCADOCLANDESTINOS (0,N) <br>

CYBERLUTADOR - acessa - MERCADOCLANDESTINO <br>
* CYBERLUTADOR acessa zero ou varios MERCADOCLANDESTINOS (0,N) <br>
* MERCADOCLANDESTINO pode ser acessado por zero ou um unico CYBERLUTADOR (0,1) <br>

CYBERLUTADOR - resolve - PUZZLE <br>
* CYBERLUTADOR resolve zero ou um PUZZLE (0,1) <br>
* PUZZLE é resolvido por zero ou um CYBERLUTADOR (0,1) <br>

SALA - esta - REGIÃO <br>
* SALA esta em uma ou várias REGIÕES (1,N) <br>
* REGIÃO pode estar com zero ou várias SALAS (0,N) <br>

PUZZLE - esta - MISSÃO <br>
* PUZZLE esta em zero ou várias MISSÕES (0,N) <br>
* MISSÃO pode estar com zero ou varios PUZZLES (0,N) <br>

CYBERLUTADOR - enfrenta - INSTANCIAINIMIGO <br>
* CYBERLUTADOR enfrenta uma ou várias INSTANCIAINIMIGO (1,N) <br>
* INSTANCIAINIMIGO é enfrentado por um único CYBERLUTADOR (1,1) <br>

Inimigo - gera - INSTANCIAINIMIGO <br>
* Inimigo gera uma ou várias InstanciasInimigo (1,N) <br>
* INSTANCIAINIMIGO é gerado por um único Inimio (1,1) <br>

CYBERLUTADOR - possui - MOCHILA <br>
* CYBERLUTADOR possui uma ou várias MOCHILAS (1,N) <br>
* MOCHILA é possuída por um único CYBERLUTADOR (1,1) <br>

CYBERLUTADOR - utiliza - IMPLANTE <br>
* CYBERLUTADOR utiliza zero ou vários IMPLANTES (0,N) <br>
* IMPLANTE é utilizado por zero ou vários CYBERLUTADOR (0,N) <br>

MOCHILA - possui - INSTANCIAITEM <br>
* MOCHILA possui zero ou várias INSTANCIAITEM (0,N) <br>
* INSTANCIAITEM é possuída por zero ou várias MOCHILAS (0,N) <br>

ITEM - gera - INSTANCIAITEM <br>
* ITEM gera um ou várias INSTANCIAITEM (1,N) <br>
* INSTANCIAITEM é gerado por um único ITEM (1,1) <br>

CYBERLUTADOR - resgata - RECOMPENSA <br>
* CYBERLUTADOR resgata zero ou vários RECOMPENSAS (0,N) <br>
* RECOMPENSA é resgatada por zero ou vários CYBERLUTADORES (0,N) <br>

CYBERLUTADOR - realiza - MISSÃO <br>
* CYBERLUTADOR realiza zero até 3 MISSÕES (0,3) <br>
* MISSÃO é ralizada por zero ou vários CYBERLUTADORES (0,N) <br>

## Histórico de versões

| Versão | Data | Descrição | Autor |
|:------:|:------:|:---------:|------:|
| 1.0 | 07/02/2025 | Criação do MER | [Gabrielly Assunção](https://github.com/GabriellyAssuncao) |

175 changes: 175 additions & 0 deletions docs/modulo3/triggers-procedures.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
# Introdução

<p align="justify">
Triggers e Stored Procedures são elementos essenciais ao banco de dados quando se diz à respeito de promover sua estabilidade e configuração correta mediante à possibilidades que não são inicialmente garantidas pelo próprio SQL. Como exemplo, situações em que se desejaria atualizar a informação de uma tabela, mediante alteração em outras, ou até garantir que a especialização e/ou generalização esteja de acordo com o previsto pelas entidades e relacionamentos de um projeto.
</p>

# Procedures

<p align="justify">
Procedures irão trazer "funções" ao banco de dados, permitindo uma execução sequencial de instruções, que podem ou não incluir condicionais, que auxiliam a executar uma sequência de ações diante de um objetivo final, como, por exemplo, inserir uma nova tupla em uma tabela, retirando a possibilidade de que um usuário externo apresente informações erradas (como um id já existente) ou ainda atualizar uma tabela de controle cujo usuário não deveria ter acesso justamente para que seja possível manter a estabilidade do banco de dados.

</p>

# Triggers
<p align="justify">
Triggers são "gatilhos" propriamente ditos, que são ativados mediante uma condição fixa que ocorre no banco de dados. Essa condição fixa se dá através de instruções DML (INSERT, UPDATE, DELETE) e podem ser ativados tanto antes (BEFORE) quanto depois (AFTER) da instrução DML que o condiciona. Através do gatilho então ativado, um procedure é automaticamente executado, sem a necessidade de fazer seu chamado ou executá-lo manualmente. Através dessa operação automática, pode-se impedir que certas ações que poderiam invalidar os dados sejam executadas, ou ainda atualizar alguma nova tabela e ou informação que tenha sua dependência no DML em questão. No caso do nosso projeto, podemos exemplificar com a compra de itens, sendo que caso o jogador não tenha "dinheiro" suficiente, ao tentar comprar um item na loja, o mesmo seria recebido com um "EXCEPTION", assim cancelando a compra e retornando para ele o problema.
</p>

## Compra de um Item em um Mercado Clandestino:

```sql
CREATE FUNCTION comprar_item() RETURNS TRIGGER AS $comprar_item$
DECLARE
valor_item INT;
saldo_atual INT;
BEGIN
SELECT i.valor INTO valor_item
FROM Item i
JOIN InstanciaItem ii ON ii.fk_item = i.idItem
WHERE ii.idInstanciaItem = NEW.fk_instanciaitem;

SELECT dinheiro INTO saldo_atual
FROM Mochila
WHERE fk_cyberlutador = NEW.fk_cyberlutador;

IF saldo_atual < valor_item THEN
RAISE EXCEPTION 'Não há dinheiro suficiente para comprar o item';
END IF;

UPDATE Mochila
SET dinheiro = dinheiro - valor_item
WHERE fk_cyberlutador = NEW.fk_cyberlutador;

RETURN NEW;
END;
$comprar_item$ LANGUAGE plpgsql;

-- Criar trigger para comprar_item
CREATE TRIGGER comprar_item_trigger
BEFORE UPDATE ON Mercado_Item
FOR EACH ROW EXECUTE FUNCTION comprar_item();

```
<p align="justify">
Com a criação do trigger, em vez de utilizarmos uma lógica de verificação a cada item, em cada loja, podemos realizar a checagem e atualização de diversos dados a partir da ação de tentar comprar um item. Neste caso, na situação em que o jogador não possuir "dinheiro" para comprar o item, o banco de dados irá retornar um erro e a operação de compra é cancelada.
</p>

## Atualizar atributos do CyberLutador:

```sql
CREATE OR REPLACE FUNCTION atualizar_atributos_cyberlutador(idCyberLutador INT, nomeNPC TEXT)
RETURNS VOID AS $$
DECLARE
aumentainteligencia INT;
aumentafurtividade INT;
aumentapercepcao INT;
BEGIN
SELECT aumentaInteligencia, aumentaFurtividade, aumentaPercepcao
INTO aumentainteligencia, aumentafurtividade, aumentapercepcao
FROM Mentor
WHERE fk_npc = (SELECT idNPC FROM NPC WHERE nomeNPC = nomeNPC)
LIMIT 1;

IF aumentainteligencia IS NULL OR aumentafurtividade IS NULL OR aumentapercepcao IS NULL THEN
RAISE NOTICE 'Nenhum mentor encontrado para o NPC %.', nomeNPC;
RETURN;
END IF;

UPDATE CyberLutador
SET inteligencia = inteligencia + COALESCE(aumentainteligencia, 0),
furtividade = furtividade + COALESCE(aumentafurtividade, 0),
percepcao = percepcao + COALESCE(aumentapercepcao, 0)
WHERE idCyberLutador = idCyberLutador;

RAISE NOTICE 'Atributos atualizados com sucesso para CyberLutador %.', idCyberLutador;
END;
$$ LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION trigger_atualizar_atributos()
RETURNS TRIGGER AS $$
BEGIN
PERFORM atualizar_atributos_cyberlutador(NEW.idCyberLutador, NEW.nomeNPC);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_atualizar_atributos
AFTER INSERT ON CyberLutador
FOR EACH ROW
EXECUTE FUNCTION trigger_atualizar_atributos();

```

<p align="justify">
Este trigger chama um procedure para atulizar os atributos do CyberLutador, como inteligência e furtividade, quando ele interage com um NPC Mentor.
</p>

## Move o inimigo para o cemitério digital:

```sql
CREATE OR REPLACE FUNCTION mover_inimigo_para_cemiterio(idInstanciaInimigo INT) RETURNS VOID AS $$
DECLARE
idSalaCemiterio INT;
BEGIN
SELECT idSala INTO idSalaCemiterio FROM Sala WHERE nomeSala = 'Cemiterio Digital';

IF idSalaCemiterio IS NULL THEN
RAISE EXCEPTION 'Cemitério Digital não encontrado';
END IF;

UPDATE NPC
SET fk_sala = idSalaCemiterio
WHERE idNPC = (
SELECT i.fk_npc
FROM InstanciaInimigo ii
JOIN Inimigo i ON ii.fk_inimigo = i.idInimigo
WHERE ii.idInstanciaInimigo = idInstanciaInimigo
);

RAISE NOTICE 'Inimigo movido para o Cemitério Digital';
END;
$$ LANGUAGE plpgsql;

```

<p align="justify">
Esse procedure move a instancia do inimigo para o cemitério dgital quando ele perde uma batalha par ao cyberlutrador.
</p>

## Reseta o jogador para a sala padrão:

```sql
CREATE OR REPLACE FUNCTION resetar_jogador(idCyberLutador INT) RETURNS VOID AS $$
DECLARE
idLaboratorio INT;
BEGIN
SELECT idSala INTO idLaboratorio FROM Sala WHERE nomeSala = 'Laboratorio';

IF idLaboratorio IS NULL THEN
RAISE EXCEPTION 'Laboratório não encontrado';
END IF;

UPDATE CyberLutador
SET vida = 10, fk_sala_atual = idLaboratorio
WHERE idCyberLutador = idCyberLutador;

RAISE NOTICE 'Jogador resetado no Laboratório com vida cheia';
END;
$$ LANGUAGE plpgsql;

```

<p align="justify">
Este procedure move o cyberlutador para a salão padrão 'laboratório' e reseta sua vida, quando ele perde uma batalha para o inimigo.
</p>

## Histórico de versões

| Versão | Data | Descrição | Autor |
|:------:|:------:|:---------:|------:|
| 1.0 | 03/02/2025 | Criação e escrita | [Lucas Meireles](https://github.com/Katuner) |
| 1.1 | 03/02/2025 | Atualização de exemplo | [Lucas Meireles](https://github.com/Katuner) |
| 1.4 | 10/02/2025 | Inserção de novos triggers e procedures | [Gabrielly Assuncao](https://github.com/GabriellyAssuncao) |

6 changes: 4 additions & 2 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,17 +47,19 @@ nav:
- Módulo 1:
- Modelo Entidade-Relacionamento:
- V1: modulo1/MER_Cyberpunk.md
- V2: modulo1/MER_v2.md
- Diagrama Entidade-Relacionamento:
- V1: modulo1/DER_Cyberpunk.md
- V2: modulo1/DER-v2.md
- Modelo Relacional:
- V1: modulo1/Modelo_Relacional.md
- Dicionário de Dados:
- V1: modulo1/Dicionario.md
- Dicionário de Dados: modulo1/Dicionario.md
- Módulo 2:
- DDL: modulo2/ddl.md
- DML: modulo2/dml.md
- DQL: modulo2/dql.md
- Módulo 3:
- Triggers e Stored Procedures: modulo3/triggers-procedures.md
markdown_extensions:
- admonition
- codehilite #formatar coodigo
Expand Down