<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Brayan Cavalcanti</title>
    <description>The latest articles on DEV Community by Brayan Cavalcanti (@bry055).</description>
    <link>https://dev.to/bry055</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1197356%2Fdc77944a-ab8b-498f-be2c-369549d7c539.png</url>
      <title>DEV Community: Brayan Cavalcanti</title>
      <link>https://dev.to/bry055</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bry055"/>
    <language>en</language>
    <item>
      <title>Tutorial: Desenvolvendo Triggers em SQL com Abrangência e Precisão Técnica</title>
      <dc:creator>Brayan Cavalcanti</dc:creator>
      <pubDate>Thu, 07 Dec 2023 20:58:13 +0000</pubDate>
      <link>https://dev.to/bry055/tutorial-desenvolvendo-triggers-em-sql-com-abrangencia-e-precisao-tecnica-jfl</link>
      <guid>https://dev.to/bry055/tutorial-desenvolvendo-triggers-em-sql-com-abrangencia-e-precisao-tecnica-jfl</guid>
      <description>&lt;p&gt;Nomes: Alisson Honório, Brayan Cavalcanti, Ricardo Oliveira.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Introdução:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Neste tutorial, exploraremos a criação de triggers em SQL, oferecendo uma visão &lt;br&gt;
abrangente e técnica sobre o assunto. A compreensão dos conceitos fundamentais, a &lt;br&gt;
aplicação prática e exemplos relevantes serão destacados para uma aprendizagem &lt;br&gt;
eficaz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Conceitos Básicos:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Evento: O evento que aciona o trigger, como INSERT, UPDATE ou DELETE.&lt;br&gt;
Tabela: A tabela à qual o trigger está vinculado.&lt;br&gt;
Ação: As instruções SQL que são executadas quando o trigger é acionado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Sintaxe Básica do Trigger:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CREATE: Cria o Trigger.&lt;br&gt;
OR REPLACE: Opcional, substitui o trigger se ele já existir.&lt;br&gt;
BEFORE ou AFTER: Indica quando o trigger deve ser acionado.&lt;br&gt;
INSERT, UPDATE, ou DELETE: Especifica o evento que aciona o trigger.&lt;br&gt;
REFERENCING NEW e OLD: Referência às linhas sendo afetadas (útil em triggers &lt;br&gt;
UPDATE)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE [OR REPLACE] TRIGGER nome_do_trigger
[BEFORE | AFTER] [INSERT | UPDATE | DELETE]
ON nome_da_tabela
[REFERENCING NEW AS novo OLD AS antigo]
FOR EACH ROW
BEGIN
   -- corpo do trigger
END;
/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Exemplo de Trigger Simples:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos criar um trigger simples que exibe uma mensagem quando ocorrer uma &lt;br&gt;
inserção em uma tabela chamada exemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE TRIGGER trigger_exemplo
AFTER INSERT
ON exemplo
FOR EACH ROW
BEGIN
   DBMS_OUTPUT.PUT_LINE('Uma nova linha foi inserida em "exemplo"!');
END;
/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo fornece uma base sólida para compreender a estrutura de um trigger &lt;br&gt;
simples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Exemplo de Trigger para Controle de Estoque:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora, criaremos um trigger mais prático que atualiza automaticamente o estoque &lt;br&gt;
disponível em uma tabela chamada produto sempre que houver uma venda&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE TRIGGER atualizar_estoque
AFTER INSERT
ON venda
FOR EACH ROW
UPDATE produto
SET quantidade_disponivel = quantidade_disponivel - :NEW.quantidade_vendida
WHERE produto_id = :NEW.produto_id;
/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo:&lt;br&gt;
O trigger é acionado após uma nova linha ser inserida na tabela venda.&lt;br&gt;
Ele atualiza a tabela produto, subtraindo a quantidade vendida do estoque disponível&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Testando os Triggers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora, você pode testar os triggers realizando inserções nas tabelas associadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Exemplo de inserção na tabela 'exemplo'
INSERT INTO exemplo (coluna1, coluna2) VALUES ('valor1', 'valor2');

-- Exemplo de inserção na tabela 'venda'
INSERT INTO venda (produto_id, quantidade_vendida) VALUES (1, 10);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a execução dessas inserções, os triggers serão acionados, e você verá as &lt;br&gt;
mensagens de saída ou as atualizações de estoque, conforme definido nos triggers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Alguns outros exemplos práticos:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;--Imagine que você queira auditar todas as alterações feitas em uma tabela chamada &lt;br&gt;
clientes. Vamos criar um trigger que registra as alterações em uma tabela de auditoria.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE TRIGGER auditar_clientes
BEFORE INSERT OR UPDATE OR DELETE
ON clientes
FOR EACH ROW
BEGIN
   IF INSERTING THEN
      INSERT INTO auditoria_clientes (acao, cliente_id, data_modificacao)
      VALUES ('Inserção', :NEW.cliente_id, SYSDATE);
   ELSIF UPDATING THEN
      INSERT INTO auditoria_clientes (acao, cliente_id, data_modificacao)
      VALUES ('Atualização', :NEW.cliente_id, SYSDATE);
   ELSIF DELETING THEN
      INSERT INTO auditoria_clientes (acao, cliente_id, data_modificacao)
      VALUES ('Exclusão', :OLD.cliente_id, SYSDATE);
   END IF;
END;
/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este trigger cria um registro na tabela “auditoria_clientes” sempre que uma inserção, &lt;br&gt;
atualização ou exclusão ocorre na tabela clientes.&lt;/p&gt;

&lt;p&gt;--Suponha que você tenha uma tabela reservas e queira garantir que uma reserva só &lt;br&gt;
seja feita se a quantidade de assentos disponíveis for suficiente. Vamos criar um trigger &lt;br&gt;
para aplicar essa restrição.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE TRIGGER verificar_assentos_disponiveis
BEFORE INSERT
ON reservas
FOR EACH ROW
BEGIN
   IF :NEW.quantidade_assentos &amp;gt; (SELECT assentos_disponiveis FROM sala WHERE sala_id = :NEW.sala_id) THEN
      RAISE_APPLICATION_ERROR(-20001, 'Não há assentos suficientes disponíveis para esta reserva.');
   END IF;
END;
/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este trigger impede a inserção de uma reserva se a quantidade de assentos solicitados &lt;br&gt;
for maior do que os assentos disponíveis na sala correspondente.&lt;/p&gt;

&lt;p&gt;--Vamos supor que você tenha uma tabela tarefas com uma coluna de data de &lt;br&gt;
conclusão (data_conclusao) e queira atualizar automaticamente essa data quando a &lt;br&gt;
tarefa for marcada como concluída. Vamos criar um trigger para realizar essa tarefa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE TRIGGER atualizar_data_conclusao
BEFORE UPDATE
ON tarefas
FOR EACH ROW
BEGIN
   IF :NEW.status = 'Concluída' AND :OLD.status &amp;lt;&amp;gt; 'Concluída' THEN
      :NEW.data_conclusao := SYSDATE;
   END IF;
END;
/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este trigger verifica se o status da tarefa foi alterado para 'Concluída' e, nesse caso, &lt;br&gt;
atualiza automaticamente a data de conclusão para a data atual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Conclusão:&lt;/strong&gt;&lt;br&gt;
 Este tutorial abrange de maneira precisa a criação de triggers em SQL, &lt;br&gt;
proporcionando um entendimento profundo e prático. A estrutura organizada, a &lt;br&gt;
clareza na explicação e os exemplos relevantes contribuem para uma experiência de &lt;br&gt;
aprendizado eficaz&lt;/p&gt;

</description>
    </item>
    <item>
      <title>O que são triggers?</title>
      <dc:creator>Brayan Cavalcanti</dc:creator>
      <pubDate>Thu, 09 Nov 2023 14:31:44 +0000</pubDate>
      <link>https://dev.to/bry055/o-que-sao-triggers-44dn</link>
      <guid>https://dev.to/bry055/o-que-sao-triggers-44dn</guid>
      <description>&lt;p&gt;Se você já estudou ou trabalhou com gerenciamento de banco de dados, certamente você já deve ter ouvido falar sobre triggers.&lt;/p&gt;

&lt;p&gt;Mas afinal, o que são? O que comem? Onde vivem?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4dk10gmga196jzbuld9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe4dk10gmga196jzbuld9.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom, segundo o google, os triggers são:" Um recurso de programação executado sempre que o evento associado ocorrer. Trigger é um tipo especial de procedimento armazenado, que é executado sempre que há uma tentativa de modificar os dados de uma tabela que é protegida por ele."&lt;/p&gt;

&lt;p&gt;Agora que já sabemos a definição, vamos a um exemplo?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flaycss8y3b4kokjf0hsg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flaycss8y3b4kokjf0hsg.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abaixo a sintaxe de um trigger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TRIGGER [Nome] 

    ON [Nome_da_tabela] 

    AFTER/BEFORE {[Operação-gatilho]} 

    AS 

    {lógica de comandos}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um exemplo funcional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE TRIGGER update_modification_date
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
    :NEW.last_modified := SYSDATE;
END;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O trigger acima foi feito para atualizar uma coluna chamada "last_modified" na tabela com o nome "employees" atualizando sua data e hora sempre que acontecerem novos updates nessa tabela, assim todas as atualizações são rastreáveis .&lt;/p&gt;

&lt;p&gt;Abaixo uma tabela de principais vantagens e desvantagens do uso dessa funcionalidade:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoowxzu5f8vvyqltwmtg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoowxzu5f8vvyqltwmtg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um exemplo prático de uso de triggers seria em um sistema de supermercado, onde os preços são constantemente atualizados, sempre que um preço de um item for alterado, o trigger será chamado para atualizar o valor deste item na tabela de preços de um supermercado.&lt;/p&gt;

&lt;p&gt;Sobre triggers seria isso pessoal, até uma próxima!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnthi8te52txlabvar6yj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnthi8te52txlabvar6yj.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
