<?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: Elisa</title>
    <description>The latest articles on DEV Community by Elisa (@socallmeollie).</description>
    <link>https://dev.to/socallmeollie</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%2F1208923%2F995b243a-37e0-4f2a-baf4-c4a46b1fbf2f.jpg</url>
      <title>DEV Community: Elisa</title>
      <link>https://dev.to/socallmeollie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/socallmeollie"/>
    <language>en</language>
    <item>
      <title>Trabalhando com Triggers na Oracle: Exemplos Práticos</title>
      <dc:creator>Elisa</dc:creator>
      <pubDate>Thu, 07 Dec 2023 23:46:42 +0000</pubDate>
      <link>https://dev.to/socallmeollie/trabalhando-com-triggers-na-oracle-exemplos-praticos-29gm</link>
      <guid>https://dev.to/socallmeollie/trabalhando-com-triggers-na-oracle-exemplos-praticos-29gm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introdução&lt;/strong&gt;&lt;br&gt;
As triggers são componentes de código PL/SQL, relacionados aos comandos de inserção, atualizar e excluir (INSERT, UPDATE e DELETE), que servem como um tipo de armazenamento, auxiliando, principalmente, na manutenção da integridade dos dados do banco de dados. Com isso em mente, iremos ver mais um pouco sobre esse mecanismo, porém agora, iremos apresentar exemplos práticos focando em cenários de uso e estudos de caso, explicação de termos técnicos, exemplos visuais e como este mecanismo pode ser utilizado numa rotina de trabalho. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplos práticos das Triggers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AFTER DELETE Trigger&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definição&lt;/strong&gt; &lt;br&gt;
Em síntese, é acionado (engatilhado) automaticamente quando acontece uma exclusão – DELETE - de uma ou mais linhas de uma tabela. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parâmetros&lt;/strong&gt; &lt;br&gt;
Nesse tipo de trigger, usando o &lt;strong&gt;DELETE&lt;/strong&gt;, são utilizados os parâmetros de ‘&lt;strong&gt;:OLD&lt;/strong&gt;’ e/ou ‘&lt;strong&gt;:NEW&lt;/strong&gt;’, cujos, representam os antigos (‘OLD’) e novos (‘NEW’) valores em uma linha afetada por uma instrução de manipulação de dados (INSERT, UPDATE, DELETE). &lt;/p&gt;

&lt;p&gt;Outro ponto sobre esses dois, é que o ‘:OLD’ na Trigger AFTER DELETE tem como uso de ver os valores da linha afetada antes de sua exclusão. Como o exemplo abaixo:&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 after_delete_example 

AFTER DELETE ON sua_tabela 

FOR EACH ROW 

DECLARE 

  v_antigo_valor VARCHAR2(50); 

BEGIN 

  v_antigo_valor := :OLD.nome_coluna; 

END; 

-- O restante do código 

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

&lt;/div&gt;



&lt;p&gt;Com isso, o &lt;strong&gt;:OLD&lt;/strong&gt;foi utilizado no &lt;strong&gt;:OLD.nome_coluna&lt;/strong&gt;que representa o &lt;strong&gt;nome_coluna&lt;/strong&gt;, porém antes da exclusão (DELETE). &lt;/p&gt;

&lt;p&gt;Agora sobre o &lt;strong&gt;:NEW&lt;/strong&gt;, utilizamos quando é referente à valores novos, não é tão utilizada em Triggers de &lt;strong&gt;AFTER DELETE&lt;/strong&gt;, mas quando é, os seus valores são nulos.   &lt;/p&gt;

&lt;p&gt;Vejamos o seguinte 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 after_delete_example 

AFTER DELETE ON sua_tabela 

FOR EACH ROW 

DECLARE 

  v_novo_valor VARCHAR2(50); 

BEGIN 

  -- O uso de :NEW é permitido, mas seus valores serão nulos após uma DELETE. 

  v_novo_valor := :NEW.nome_coluna; 

END; 

-- O restante do código 

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

&lt;/div&gt;



&lt;p&gt;Como podemos observar, o ‘:NEW’ apenas adicionou um novo valor ao ‘nome_coluna’, sendo este, nulo. Além disso, ele não é tanto utilizado no DELETE, e sim, o ‘:OLD’. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cenários de uso e Estudo de caso&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As Triggers podem estar presentes em vários cenários de uso, então, segue abaixo alguns desses cenários, junto de sua implementação e estudo de caso: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Auditoria e registro de alterações&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cenário de uso:&lt;/strong&gt; Tem que manter a tabela com os dados do histórico de alterações para auxiliar a auditoria.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementação de uso:&lt;/strong&gt; A trigger AFTER DELETE vai ser usado depois de uma exclusão de um registro, colocando os detalhes dessa ação na tabela de  ou de auditoria.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Criação da Tabela Principal 

CREATE TABLE Produtos ( 

    ProdutoID NUMBER PRIMARY KEY, 

    Nome VARCHAR2(255), 

    Preco NUMBER(10, 2) 

); 



-- Criação da Tabela de Auditoria 

CREATE TABLE Produtos_Historico ( 

    HistoricoID NUMBER PRIMARY KEY, 

    ProdutoID NUMBER, 

    NomeAnterior VARCHAR2(255), 

    PrecoAnterior NUMBER(10, 2), 

    DataExclusao TIMESTAMP 

); 



-- Trigger AFTER DELETE para Auditoria em Oracle 

CREATE OR REPLACE TRIGGER ExclusaoProdutoTrigger 

AFTER DELETE ON Produtos 

FOR EACH ROW 

BEGIN 

    INSERT INTO Produtos_Historico (ProdutoID, NomeAnterior, PrecoAnterior, DataExclusao) 

    VALUES (:OLD.ProdutoID, :OLD.Nome, :OLD.Preco, SYSTIMESTAMP); 

END; 

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

&lt;/div&gt;



&lt;p&gt;Vamos ver em detalhes o que cada item dentro da nossa declaração faz: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CREATE OR REPLACE TRIGGER:&lt;/strong&gt; Cria ou substitui uma trigger. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CREATE TABLE:&lt;/strong&gt; Cria uma tabela. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AFTER DELETE ON Produtos:&lt;/strong&gt; Indica que o trigger será acionado após a execução de uma instrução DELETE na tabela Produtos. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FOR EACH ROW:&lt;/strong&gt; Usado para definir que o gatilho será disparado para cada linha que foi usado o AFTER DELETE. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;:OLD:&lt;/strong&gt; Usado para representar onde os valores antigos das colunas foram afetados pela instrução DELETE. Visto que, no Oracle este pseudo-registro tem como utilidade referenciar os valores antigos nas triggers AFTER DELETE. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;INSERT INTO:&lt;/strong&gt; Insere valores dentro das tabelas. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VALUES:&lt;/strong&gt; Representa os valores/dados inseridos dentro das tabelas. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Desativação lógica em vez de exclusão física&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cenário de uso:&lt;/strong&gt; Declarar uma desativação lógica ao invés de implementar uma exclusão física do registro/valor. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementação de uso:&lt;/strong&gt; A trigger AFTER DELETE será utilizada para deixar o registro dado como “inativo” ou "excluído" por meio de uma alteração de estado.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Criação da Tabela Funcionarios 

CREATE TABLE Funcionarios ( 

    FuncionarioID NUMBER PRIMARY KEY, 

    Nome VARCHAR2(255), 

    Ativo BOOLEAN 

); 



-- Trigger AFTER DELETE para Exclusão Lógica em Oracle 

CREATE OR REPLACE TRIGGER ExclusaoLogicaFuncionarioTrigger 

AFTER DELETE ON Funcionarios 

FOR EACH ROW 

BEGIN 

    UPDATE Funcionarios SET Ativo = 0 WHERE FuncionarioID = :OLD.FuncionarioID; 

END; 

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

&lt;/div&gt;



&lt;p&gt;Vamos ver em detalhes o que cada item dentro da nossa declaração faz: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CREATE OR REPLACE TRIGGER:&lt;/strong&gt; Cria ou substitui uma trigger. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CREATE TABLE:&lt;/strong&gt; Cria uma tabela. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ativo BOOLEAN:&lt;/strong&gt; Coluna que representa o estado ativo/inativo do funcionário. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SET Ativo = 0:&lt;/strong&gt; Desativa o funcionário (exclusão lógica) atualizando o campo Ativo. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Integridade referencial e exclusões em cascata:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cenário de uso:&lt;/strong&gt; Declarar que a exclusão (DELETE) de um registro/valor de uma tabela principal reflita nas outras tabelas que estiverem relacionadas.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementação de uso:&lt;/strong&gt; A trigger AFTER DELETE irá excluir os valores/registros que estiverem associados em outras tabelas, mantendo a integridade referencial.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Criação da Tabela Clientes 

CREATE TABLE Clientes ( 

    ClienteID NUMBER PRIMARY KEY, 

    Nome VARCHAR2(255) 

); 



-- Criação da Tabela Pedidos 

CREATE TABLE Pedidos ( 

    PedidoID NUMBER PRIMARY KEY, 

    ClienteID NUMBER REFERENCES Clientes(ClienteID), 

    ValorTotal NUMBER(10, 2) 

); 



-- Trigger AFTER DELETE para Integridade Referencial em Oracle 

CREATE OR REPLACE TRIGGER ExclusaoClienteTrigger 

AFTER DELETE ON Clientes 

FOR EACH ROW 

BEGIN 

    DELETE FROM Pedidos WHERE ClienteID = :OLD.ClienteID; 

END; 

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

&lt;/div&gt;



&lt;p&gt;Vamos ver em detalhes o que cada item dentro da nossa declaração faz: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CREATE OR REPLACE TRIGGER:&lt;/strong&gt; Cria ou substitui uma trigger. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CREATE TABLE:&lt;/strong&gt; Cria uma tabela. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REFERENCES Clientes(ClienteID):&lt;/strong&gt; Declara uma chave estrangeira na tabela Pedidos, referenciando a coluna ClienteID na tabela Clientes. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DELETE FROM Pedidos WHERE ClienteID = :OLD.ClienteID;:&lt;/strong&gt; Excluí os valores datados na tabela Pedidos, os quais, pertencem ao Cliente excluído. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Limpeza de dados relacionados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cenário de uso:&lt;/strong&gt; Os dados que estiverem relacionados/dependentes com registros principais, serão excluídos automaticamente assim que os valores principais forem deletados.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementação de uso:&lt;/strong&gt; Utilizar trigger AFTER DELETE para remover valores de uma vez em tabelas relacionadas, evitando dados órfãos.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Criação da Tabela Departamentos 

CREATE TABLE Departamentos ( 

    DepartamentoID NUMBER PRIMARY KEY, 

    Nome VARCHAR2(255) 

); 



-- Criação da Tabela Funcionarios 

CREATE TABLE Funcionarios ( 

    FuncionarioID NUMBER PRIMARY KEY, 

    Nome VARCHAR2(255), 

    DepartamentoID NUMBER REFERENCES Departamentos(DepartamentoID) 

); 



-- Trigger AFTER DELETE para Limpeza de Dados Relacionados em Oracle 

CREATE OR REPLACE TRIGGER LimpezaFuncionariosTrigger 

AFTER DELETE ON Departamentos 

FOR EACH ROW 

BEGIN 

    DELETE FROM Funcionarios WHERE DepartamentoID = :OLD.DepartamentoID; 

END; 

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

&lt;/div&gt;



&lt;p&gt;Vamos ver em detalhes o que cada item dentro da nossa declaração faz: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CREATE OR REPLACE TRIGGER:&lt;/strong&gt; Cria ou substitui uma trigger. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CREATE TABLE:&lt;/strong&gt; Cria uma tabela. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REFERENCES Departamentos(DepartamentoID):&lt;/strong&gt; Declara uma chave estrangeira na tabela Funcionarios, referenciando a coluna DepartamentoID na tabela Departamentos. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DELETE FROM Funcionarios WHERE DepartamentoID = :OLD.DepartamentoID;:&lt;/strong&gt; Exclusão automática dos valores que estiverem na tabela Funcionarios, os quais, já pertencem ao Departamento, anteriormente, excluído. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explicação de termos técnicos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Até que, é bem claro que existem vários termos técnicos associados a triggers AFTER DELETE, portanto, segue abaixo alguns termos mais básicos e comuns: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Logging (Registro):&lt;/strong&gt;&lt;br&gt;
Ele desempenha o papel de registrar as informações importantes, já que falamos do AFTER DELETE, temos o detalhamento sobre as exclusões de registros/valores que foram feitas nas tabelas. registro (logging) é uma prática comum em triggers para registrar  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;REFERENCING:&lt;/strong&gt;&lt;br&gt;
É um auxiliador na hora de associar nomes alternativos (aliases), acompanhando de um OLD ou NEW, um exemplo seria no caso de OLD, você pode usar o REFERECING para referenciar um estado anterior de uma linha do banco de dados do sistema. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PL/SQL:&lt;/strong&gt;&lt;br&gt;
Se trata de uma linguagem da Oracle, que é utilizada para triggers e outros tipos de blocos de códigos dentro dos banco de dados. As triggers são comumentes escritas para automatizar alguma tarefa específica. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplos práticos&lt;/strong&gt;&lt;br&gt;
Como primeiro exemplo, vamos supor que você queira criar uma tabela “Clientes” e a outra “Pedidos”, sendo que ambas estão relacionadas. A partir disso, você percebe que caso um cliente for excluído, todo e qualquer pedido relacionado a ele tem que ser deletado igualmente. E é aí que o AFTER DELETE pode te auxiliar nessa tarefa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Criação da tabela clientes 

CREATE TABLE clientes ( 

    cliente_id NUMBER PRIMARY KEY, 

    nome VARCHAR2(50), 

    email VARCHAR2(100) 

); 



-- Criação da tabela pedidos 

CREATE TABLE pedidos ( 

    pedido_id NUMBER PRIMARY KEY, 

    cliente_id NUMBER REFERENCES clientes(cliente_id), 

    valor NUMBER 

); 



-- Criação da trigger AFTER DELETE 

CREATE OR REPLACE TRIGGER after_delete_cliente 

AFTER DELETE ON clientes 

FOR EACH ROW 

BEGIN 

    -- Excluir todos os pedidos associados ao cliente excluído 

    DELETE FROM pedidos WHERE cliente_id = :OLD.cliente_id; 



    DBMS_OUTPUT.PUT_LINE('Trigger AFTER DELETE executada com sucesso.'); 

END; 

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

&lt;/div&gt;



&lt;p&gt;Acima temos a nossa trigger chamada &lt;strong&gt;after_delete_cliente&lt;/strong&gt; que vai ser engatilhada assim que ocorrer uma exclusão em alguma linha da tabela Clientes. Além disso, podemos observar que temos um bloco do PL/SQL que vai acionar um &lt;strong&gt;DELETE&lt;/strong&gt; dentro da trigger na tabela de Pedidos, ou seja, ali vai acontecer o que o usuário queria: excluir todo e qualquer pedido relacionado/associado ao cliente que foi excluído. Um detalhe que expõe que está funcionando e que sua função está voltada a informar ao usuário é quando mostra a mensagem "Trigger AFTER DELETE executada com sucesso." a qual, é exibida usando &lt;strong&gt;DBMS_OUTPUT.PUT_LINE&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Ainda tem algumas outras dúvidas sobre outras situações que o &lt;strong&gt;AFTER DELETE&lt;/strong&gt; pode ser útil? Então vamos para um segundo exemplo. Imagina que você tem um banco de dados com duas tabelas, uma chamada Funcionarios e a outra &lt;strong&gt;historico_salarios&lt;/strong&gt;. Só que, você quer que quando ocorrer uma exclusão na tabela Funcionarios, um registro no histórico de salários ocorra antes mesmo de remover esse funcionário. Tendo isso em vista, vamos ver uma forma de escrever isso em bloco de código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Criação da tabela funcionarios 

CREATE TABLE funcionarios ( 

    funcionario_id NUMBER PRIMARY KEY, 

    nome VARCHAR2(50), 

    salario NUMBER 

); 



-- Criação da tabela historico_salarios 

CREATE TABLE historico_salarios ( 

    historico_id NUMBER PRIMARY KEY, 

    funcionario_id NUMBER REFERENCES funcionarios(funcionario_id), 

    salario_anterior NUMBER, 

    data_modificacao DATE 

); 



-- Criação da trigger AFTER DELETE 

CREATE OR REPLACE TRIGGER after_delete_funcionario 

AFTER DELETE ON funcionarios 

FOR EACH ROW 

DECLARE 

    salario_anterior NUMBER; 

BEGIN 

    -- Armazenar o salário anterior no histórico_salarios 

    salario_anterior := :OLD.salario; 



    INSERT INTO historico_salarios (funcionario_id, salario_anterior, data_modificacao) 

    VALUES (:OLD.funcionario_id, salario_anterior, SYSDATE); 



    DBMS_OUTPUT.PUT_LINE('Trigger AFTER DELETE executada com sucesso.'); 

END; 

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

&lt;/div&gt;



&lt;p&gt;Aqui podemos ver que a trigger &lt;strong&gt;after_delete_funcionario&lt;/strong&gt; é a que desempenha a função que você queria, pois assim que ela é engatilhada, ocorre a exclusão de uma linha na tabela Funcionários. Enquanto o salário anterior do funcionário vai ficar armazenado dentro da trigger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BEFORE DELETE Trigger&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definição&lt;/strong&gt; &lt;br&gt;
É uma função automática que verificar &lt;strong&gt;eventos de exclusão&lt;/strong&gt; e executa a exclusão dos dados ou registros. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parâmetros&lt;/strong&gt; &lt;br&gt;
No trigger &lt;strong&gt;BEFORE DELETE&lt;/strong&gt;, são usados alguns parâmetros como o :OLD e o NEW que são pseudo-registros referidos para acessar dados em nível de linha ao usar o gatilho em nível de linha. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;:old&lt;/strong&gt; - refere-se ao valor antigo
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;:new&lt;/strong&gt; - refere-se ao novo valor &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt;&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 Print_salary_changes  

    BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab  

    FOR EACH ROW  

WHEN (new.Empno &amp;gt; 0)  

DECLARE sal_diff number;  



BEGIN  

 sal_diff  := :new.sal  - :old.sal;  

 dbms_output.put('Old salary: ' || :old.sal);  

 dbms_output.put('  New salary: ' || :new.sal);  

 dbms_output.put_line('  Difference ' || sal_diff);  

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cenários de uso e Estudo de caso&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Registro de Logs:&lt;/strong&gt; Registar detalhes sobre as exclusões feitas, exemplo um histórico de navegação. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo de uso:&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 log_before_delete  

BEFORE DELETE ON employees  

FOR EACH ROW  

BEGIN  

 INSERT INTO audit_log (action, table_name, record_id, timestamp)                                                                                                                           VALUES ('DELETE', 'employees', :OLD.employee_id, SYSTIMESTAMP);  

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

&lt;/div&gt;



&lt;p&gt;No código acima toda vez que a função &lt;strong&gt;audit_lo&lt;/strong&gt;g é chamada, depois de uma exclusão na tabela de “employees”. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicação de termos técnicos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os termos técnicos do Trigger &lt;strong&gt;BEFORE DELETE&lt;/strong&gt;, segue as seguintes técnicas para utilização nos projetos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FOR EACH ROW:&lt;/strong&gt; É uma função propria que u, BEFORE DELETE TRIGGER, será executado por cada linha afetada pela função ou operação “DELETE”. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BEGIN E END:&lt;/strong&gt; Essa função é responsável por delimitar um certo bloco de código de um trigger. Quando entra no BEGIN e END, é responsável por toda a lógica de quando um trigger BEFORE DELETE, for executado.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OLD:&lt;/strong&gt; Essa OLD, ele é uma referência de valores antigos, antes das operações SQL, que ajuda a olhar valores já existentes nas colunas que serão deletadas, o OLD, também é útil para comparar valores antigos com certas condições. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplos práticos&lt;/strong&gt;&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 before_delete_cliente  

BEFORE DELETE ON clientes  

FOR EACH ROW  

BEGIN  

   -- Registra a exclusão na tabela de auditoria  

INSERT INTO auditoria_clientes (cliente_id, acao, data)  

VALUES (:OLD.cliente_id, 'Exclusão', SYSDATE);  

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

&lt;/div&gt;



&lt;p&gt;Nesse exemplo acima, esse &lt;strong&gt;BEFORE DELETE&lt;/strong&gt;, é aplicado para inserir um registro na tabela auditoria sempre que cliente for excluído. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AFTER UPDATE Trigger&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definição&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
É um gatilho que é disparado &lt;strong&gt;APÓS&lt;/strong&gt; o &lt;strong&gt;UPDATE&lt;/strong&gt; de uma tabela que foi anteriormente especificada na declaração da &lt;strong&gt;TRIGGER&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parâmetros&lt;/strong&gt; &lt;br&gt;
Nesse tipo de trigger, usando o UPDATE, são utilizados os parâmetros de &lt;strong&gt;:OLD&lt;/strong&gt; e/ou &lt;strong&gt;:NEW&lt;/strong&gt;, cujos, representam os antigos (OLD) e novos (NEW) valores em uma linha afetada por uma instrução de manipulação de dados (INSERT, UPDATE, DELETE). &lt;/p&gt;

&lt;p&gt;Outro ponto sobre esses dois, é que o &lt;strong&gt;:OLD&lt;/strong&gt; na Trigger &lt;strong&gt;AFTER UPDATE&lt;/strong&gt; nos dá a possibilidade de fazer uso dos valores da linha afetada antes de sua atualização. Como o exemplo abaixo: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cenários de uso e Estudo de caso&lt;/strong&gt; &lt;br&gt;
Vamos supor que tenhamos um &lt;strong&gt;sistema de gerenciamento de funcionários&lt;/strong&gt;. Nesse sistema, precisaremos fazer alterações no salário dos mesmos, porém, temos a necessidade de que caso o novo salário inserido seja maior que o antigo, que tenhamos um log(mensagem) dessa alteração. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explicação de termos técnicos&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CREATE OR REPLACE TRIGGER:&lt;/strong&gt; Cria ou substitui uma trigger. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AFTER UPDATE ON:&lt;/strong&gt; Executará a trigger somente após uma atualização (update) na tabela aplicada. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FOR EACH ROW:&lt;/strong&gt; Executará o código do escopo para cada linha. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BEGIN:&lt;/strong&gt; Define o ponto inicial do código da trigger. 
-&lt;strong&gt;IF (:NEW.salario &amp;gt; :OLD.salario):&lt;/strong&gt; Realizará uma condição ontem só será executado o código do escopo caso o :NEW.salario seja maior que o :OLD.salario. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;THEN:&lt;/strong&gt; Realiza código caso a condição do IF seja veradeira. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;END IF:&lt;/strong&gt; Encerra o escopo da condição. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplos práticos&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Registros de Logs:&lt;/strong&gt;&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 log_aumento_salario 

AFTER UPDATE ON funcionarios 

FOR EACH ROW 

BEGIN 

  IF (:NEW.salario &amp;gt; :OLD.salario) THEN 

    Registrar_aumento_salario(:NEW.id, :NEW.salario - :OLD.salario); 

  END IF; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste cenário, temos uma trigger que cria logs quando acontece um update de salário na tabela funcionários. Porém, a trigger só registra um aumento quando o &lt;strong&gt;:NEW.salario&lt;/strong&gt; é maior que o &lt;strong&gt;:OLD. Salario&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BEFORE UPDATE Trigger&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definição&lt;/strong&gt; &lt;br&gt;
Basicamente o &lt;strong&gt;BEFORE UPDATE Trigger&lt;/strong&gt; é um mecanismo que mudar os registros/dados antes mesmo de acontecer uma atualização - &lt;strong&gt;UPDATE&lt;/strong&gt; - em alguma linha na tabela de um banco de dados. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parâmetros&lt;/strong&gt; &lt;br&gt;
Os parâmetros do &lt;strong&gt;BEFORE UPDATE&lt;/strong&gt;, são &lt;strong&gt;OLD&lt;/strong&gt; e o &lt;strong&gt;NEW&lt;/strong&gt;, são usados para acessar valores novos e antigos durante a execução da trigger, e podendo ser manipulados. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cenários de uso e Estudo de caso&lt;/strong&gt; &lt;br&gt;
Vamos imaginar que temos um &lt;strong&gt;sistema gerenciador de estoque de produtos&lt;/strong&gt;, como todo sistema de estoque, temos que fazer atualizações frequentes no número de produtos para manter o estoque sempre atualizado, porém, temos uma regra de negócio, nosso estoque só pode ser atualizado caso o número de produtos seja maior que o mínimo definido pelo usuário. Vejamos na prática! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplos práticos&lt;/strong&gt; &lt;br&gt;
Agora vamos ilustrar alguns conceitos de como seria o &lt;strong&gt;BEFORE UPDATE Trigger&lt;/strong&gt; num banco de dados. Suponhamos que exista uma tabela chamada &lt;strong&gt;produtos&lt;/strong&gt;, a qual precisa verificar automaticamente a situação do estoque, já que caso algum produto fique abaixo da do mínimo permitido. Para resolver isso, precisamos criar um trigger que vai quando for acionado, irá impedir que ocorra essa atualização:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Criar a tabela de produtos 

CREATE TABLE produtos ( 

    id INT PRIMARY KEY, 

    nome VARCHAR(255), 

    estoque INT, 

    estoque_minimo INT 

); 



-- Criar um BEFORE UPDATE Trigger 

DELIMITER // 

CREATE TRIGGER antes_de_atualizar_produto 

BEFORE UPDATE ON produtos 

FOR EACH ROW 

BEGIN 

    -- Verificar se a atualização reduz o estoque abaixo do mínimo permitido 

    IF NEW.estoque &amp;lt; NEW.estoque_minimo THEN 

        SIGNAL SQLSTATE '45000' 

        SET MESSAGE_TEXT = 'Atualização não permitida. Estoque abaixo do mínimo.'; 

    END IF; 

END; 

// 

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

&lt;/div&gt;



&lt;p&gt;Vamos ver em detalhes o que cada item dentro da nossa declaração faz: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CREATE TRIGGER:&lt;/strong&gt; Cria um novo gatilho (trigger). &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;antes_de_atualizar_produto:&lt;/strong&gt; O nome da trigger que foi escolhido para o exemplo, pode ser personalizado. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BEFORE UPDATE ON produtos:&lt;/strong&gt; A trigger é engatilhada antes  de uma atualização na tabela &lt;strong&gt;produtos&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FOR EACH ROW:&lt;/strong&gt; Define que o gatilho será executado para cada linha afetada pela operação de atualização. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BEGIN...END:&lt;/strong&gt; Indica o limite do bloco de código que será executado pela trigger. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IF...THEN...END IF:&lt;/strong&gt; Um condicional que analisa se a condição for verdadeira ou não.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SIGNAL SQLSTATE '45000':&lt;/strong&gt; Declara uma exceção personalizada se a condição IF for verdadeira. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AFTER INSERT Trigger&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definição&lt;/strong&gt; &lt;br&gt;
Se trata de uma ferramenta que depois que acontece uma operação de inserção - &lt;strong&gt;INSERT&lt;/strong&gt; - de novos registros/dados numa tabela, a trigger será engatilhada. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parâmetros&lt;/strong&gt; &lt;br&gt;
No &lt;strong&gt;AFTER INSERT&lt;/strong&gt;, é muito usado o parâmetro NEW, onde o NEW representa valores novos que são inseridos nas colunas das tabelas depois da execução de inserção de valores. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cenários de uso e Estudo de caso&lt;/strong&gt; &lt;br&gt;
Um cenário ideal para explicar de forma simples e intuitiva o &lt;strong&gt;AFTER INSERT&lt;/strong&gt; é uma funcionalidade de Notificação, onde os novos dados são inseridos, e o &lt;strong&gt;AFTER INSERT&lt;/strong&gt;, entra nesse exemplo quando é inserido um novo dado, pois ele chama e aciona um processo de envio de e-mail. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplos práticos&lt;/strong&gt; &lt;br&gt;
Ainda tem algumas outras dúvidas sobre outras situações que o &lt;strong&gt;AFTER INSERT Trigger&lt;/strong&gt; pode ser útil? Então vamos para um segundo exemplo. Neste próximo exemplo, vamos supor que exista uma tabela chamada pedidos e você precisa que sempre que um novo pedido é inserido na tabela pedidos, um gatilho - &lt;strong&gt;AFTER INSERT Trigger&lt;/strong&gt; - seja engatilhado, ou seja, que ocorra uma atualização simultânea no status de envio para 'Aguardando Envio'. Com isso, vejamos como seria feito:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Criar um AFTER INSERT Trigger 

DELIMITER // 

CREATE TRIGGER apos_inserir_pedido 

AFTER INSERT ON pedidos 

FOR EACH ROW 

BEGIN 

    -- Atualizar automaticamente o status de envio para 'Aguardando Envio' 

    UPDATE pedidos 

    SET status_envio = 'Aguardando Envio' 

    WHERE id = NEW.id; 

END; 

// 

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

&lt;/div&gt;



&lt;p&gt;Vamos ver em detalhes o que cada item dentro da nossa declaração faz: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CREATE TRIGGER:&lt;/strong&gt; Cria um novo gatilho. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;apos_inserir_pedido:&lt;/strong&gt; Nome do gatilho desse banco de dados. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AFTER INSERT ON pedidos:&lt;/strong&gt; Indica que o gatilho é acionado após uma inserção na tabela "pedidos".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FOR EACH ROW:&lt;/strong&gt; Usado para definir que o gatilho será disparado para cada linha que foi usado o &lt;strong&gt;BEFORE UPDATE&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BEGIN...END:&lt;/strong&gt; São comandos para limitar o começo e final do código que será executado pela trigger. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UPDATE pedidos:&lt;/strong&gt;Atualiza a tabela "pedidos". &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SET status_envio = 'Aguardando Envio':&lt;/strong&gt; Um novo valor a coluna &lt;strong&gt;status_envio&lt;/strong&gt; para &lt;strong&gt;Aguardando Envio&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WHERE id = NEW.id:&lt;/strong&gt; Restringe a atualização apenas ao registro recém-inserido (referenciado por NEW). &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DELIMITER:&lt;/strong&gt; Define um limite para instruções SQL mais complexas, permitindo que o ponto e vírgula (;) seja utilizado dentro do bloco de código do gatilho sem ser interpretado como o final da instrução. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Considerações finais&lt;/strong&gt;&lt;br&gt;
Em síntese, as triggers são um componente fundamental e de grande importância no desempenho, automatização, gerenciamento e construção de banco de dados. Portanto, se trata de uma ferramenta muito útil ao construir e gerenciar um sistema, especialmente, quando se trata de controle. Todas as Triggers apresentadas aqui acima desempenham papéis cruciais nos bancos de dados, proporcionando um maior controle sobre as operações realizadas nas tabelas. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências bibliográficas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/socallmeollie/trabalhando-com-triggers-no-oracle-5786"&gt;https://dev.to/socallmeollie/trabalhando-com-triggers-no-oracle-5786&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.techonthenet.com/oracle/triggers/after_delete.php"&gt;https://www.techonthenet.com/oracle/triggers/after_delete.php&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.javatpoint.com/mysql-after-delete-trigger"&gt;https://www.javatpoint.com/mysql-after-delete-trigger&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>bd</category>
      <category>oracle</category>
      <category>trigger</category>
    </item>
    <item>
      <title>Trabalhando com Triggers no Oracle</title>
      <dc:creator>Elisa</dc:creator>
      <pubDate>Mon, 13 Nov 2023 19:51:22 +0000</pubDate>
      <link>https://dev.to/socallmeollie/trabalhando-com-triggers-no-oracle-5786</link>
      <guid>https://dev.to/socallmeollie/trabalhando-com-triggers-no-oracle-5786</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introdução&lt;/strong&gt;&lt;br&gt;
As triggers são componentes de código PL/SQL, relacionados aos comandos de inserção, atualizar e excluir (INSERT, UPDATE e DELETE), que servem como um tipo de armazenamento, auxiliando, principalmente, na manutenção da integridade dos dados do banco de dados. Com isso em mente, iremos ver mais um pouco sobre esse mecanismo que desempenham um papel crucial no gerenciamento de banco de dados e automação de tabelas.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definição&lt;/strong&gt;&lt;br&gt;
Uma trigger são mecanismos do tipo procedimento armazenado, que são executados assim que os dados sofrem mudanças num banco de dados. Estes, que são por meio do DML (Data Manipulation Language) utilizando INSERT, UPDATE ou DELETE numa tabela ou view. São engatilhadas em qualquer situação válida dentro do sistema do banco. Também podem ser acionadas por meio do DDL (Data Definition Language), usando CREATE, ALTER e DROP. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sintaxe de uma Trigger&lt;/strong&gt;&lt;br&gt;
Para que possamos criar uma trigger, precisamos utilizar a sua declaração, que é:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;CREATE TRIGGER&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sua declaração pode variar, de acordo com o tipo de Trigger que você deseja criar, podendo ser um Dml Trigger, Schema Trigger ou Database Trigger. &lt;/p&gt;

&lt;p&gt;As Triggers que normalmente são mais usadas são as Triggers de DML, então, vamos ver alguns exemplos com esses casos.&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_NAME 
{BEFORE | AFTER} dml_event ON TABLE_NAME
[FOR EACH ROW] 
  [DECLARE variable] 
  BEGIN 
  pl_sql_code 
  [EXCEPTION exception_code] 
  END; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos ver em detalhes o que cada item dentro da nossa declaração faz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OR REPLACE: Usada de forma opcional. Caso você use-a, qualquer outra trigger que conter o mesmo nome, será substituída por essa Trigger que você está criando; &lt;/li&gt;
&lt;li&gt;nome_trigger: Nome dado a trigger dentro do banco de dados (database); &lt;/li&gt;
&lt;li&gt;BEFORE | AFTER: Definide se você deseja que a trigger seja disparada antes ou depois de alguma declaração ou evento; &lt;/li&gt;
&lt;li&gt;evento_dml: Esse é o responsável pelo disparo da nossa trigger, ele pode ser usado juntamente com INSERT, UPDATE ou DELETE; &lt;/li&gt;
&lt;li&gt;nome_tabela: Esse é o nome da tabela que disparará o evento para nossa trigger; &lt;/li&gt;
&lt;li&gt;FOR EACH ROW: Usado para definir de o gatilho será disparado para cada linha de comando, caso não use essa declaração, a trigger só será disparada uma vez; &lt;/li&gt;
&lt;li&gt;DECLARE: Caso você necessite de variáveis dentro da sua trigger, você pode usar o declare. Lembrando que elas só podem e serão usadas dentro da trigger; &lt;/li&gt;
&lt;li&gt;codigo_pl_sql: Aqui é onde escreveremos o comportamento da nossa trigger e tudo o que ela irá fazer;&lt;/li&gt;
&lt;li&gt;EXCEPTION: Nossa exception é o nosso retorno caso haja algum erro, esperado ou não. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando escrevemos triggers para dml, a sua finalidade é ser para uma instrução, com isso, precisamos fazer a referenciação aos dados dentro da instrução. Como por exemplo: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dados que estão sendo inseridos em um INSERT; &lt;/li&gt;
&lt;li&gt;Dados sendo atualizados em um UPDATE (podendo ser os dados antigos ou novos); &lt;/li&gt;
&lt;li&gt;Dados sendo excluídos em um DELETE.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podemos referenciá-los com duas variáveis.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;:NEW &lt;/li&gt;
&lt;li&gt;:OLD &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos a um exemplo: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Supondo que você deseja pegar o valor de um salário antes que um UPDATE seja inserido, você pode usar: &lt;br&gt;
:OLD.salario &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caso você deseje pegar o valor de um novo salário após um INSERT, você pode usar:&lt;br&gt;
:NEW.salario &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Há diversos modo de utilizarmos Triggers, abaixo, temos uma tabela onde podemos ver as situações na qual podemos utilizá-las com :NEW e :OLD. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tGC-AWDP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v0zf0ugrnyitvnsj14xh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tGC-AWDP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v0zf0ugrnyitvnsj14xh.PNG" alt="Esta tabela descreve quando você pode ou não ler ou atualizar esses valores" width="644" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos ver agora alguns exemplos de situações em que aplicamos as Triggers. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SINTAXE BEFORE INSERT TRIGGER&lt;/strong&gt;&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_name 
BEFORE INSERT ON table_name 
[FOR EACH ROW] 
  [DECLARE variables] 
  BEGIN 
  pl_sql_code 
  [EXCEPTION exception_code] 
  END; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas observações: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você não pode criar uma Trigger BEFORE INSERT em uma VIEW, a menos que seja uma VIEW de edição;&lt;/li&gt;
&lt;li&gt;Se você executar uma Trigger de instrução e omitir a cláusula FOR EACH ROW, não poderá ler as variáveis :NEW e :OLD, pois eles não existem para um Trigger INSERT.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SINTAXE AFTER INSERT TRIGGER&lt;/strong&gt;&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_name 
AFTER INSERT ON table_name 
[FOR EACH ROW] 
[DECLARE variables] 
BEGIN 
  pl_sql_code 
[EXCEPTION exception_code] 
END; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas observações: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você não pode criar um gatilho AFTER INSERT em uma visualização, a menos que seja uma visualização de edição;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se você estiver executando um gatilho de instrução (omitindo a cláusula FOR EACH ROW), não poderá ler as variáveis :NEW ou :OLD;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se você estiver executando um gatilho de linha (usando FOR EACH ROW): &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Você pode ler, mas não atualizar os :NEW valores; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Você não pode ler ou atualizar os valores :OLD, pois eles não existem para um gatilho INSERT. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SINTAXE BEFORE UPDATE TRIGGER&lt;/strong&gt;&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_name 
BEFORE UPDATE ON table_name 
[FOR EACH ROW] 
[DECLARE variables] 
BEGIN 
  pl_sql_code 
[EXCEPTION exception_code] 
END; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas observações: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um TRIGGER BEFORE UPDATE é um TRIGGER executado antes de uma instrução UPDATE ser executada;&lt;/li&gt;
&lt;li&gt;Se você executar uma Trigger de instrução e omitir a cláusula FOR EACH ROW, não poderá ler as variáveis :NEW e :OLD, pois eles não existem para um Trigger INSERT; &lt;/li&gt;
&lt;li&gt;Você não pode criar um gatilho BEFORE UPDATE em uma visualização, a menos que seja uma visualização de edição; &lt;/li&gt;
&lt;li&gt;Se você estiver executando um gatilho de instrução (omitindo a cláusula FOR EACH ROW), não poderá ler as variáveis :NEW ou :OLD; &lt;/li&gt;
&lt;li&gt;Se você estiver executando um gatilho de linha (usando FOR EACH ROW), poderá ler e atualizar os valores :NEW e :OLD.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SINTAXE AFTER UPDATE TRIGGER&lt;/strong&gt;&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_name 
AFTER UPDATE ON table_name 
[FOR EACH ROW] 
[DECLARE variables] 
BEGIN 
  pl_sql_code 
[EXCEPTION exception_code] 
END; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas observações sobre o AFTER UPDATE: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você não pode criar um gatilho AFTER UPDATE em uma visualização, a menos que seja uma visualização de edição; &lt;/li&gt;
&lt;li&gt;Se você estiver executando um gatilho de instrução (omitindo a cláusula FOR EACH ROW), não poderá ler as variáveis :NEW ou :OLD; &lt;/li&gt;
&lt;li&gt;Se você estiver executando um gatilho de linha (usando FOR EACH ROW), poderá ler, mas não atualizar, os valores :NEW e :OLD.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SINTAXE BEFORE DELETE TRIGGER&lt;/strong&gt;&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_name 
BEFORE DELETE ON table_name 
[FOR EACH ROW] 
[DECLARE variables] 
BEGIN 
  pl_sql_code 
[EXCEPTION exception_code] 
END; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas observações: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você não pode criar um gatilho BEFORE DELETE em uma visualização, a menos que seja uma visualização de edição; &lt;/li&gt;
&lt;li&gt;Se você estiver executando um gatilho de instrução (omitindo a cláusula FOR EACH ROW), não poderá ler os valores :OLD; &lt;/li&gt;
&lt;li&gt;Se você estiver executando um gatilho de linha (usando FOR EACH ROW), poderá ler e atualizar os valores :OLD. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SINTAXE AFTER DELETE TRIGGER&lt;/strong&gt;&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_name 
AFTER DELETE ON table_name 
[FOR EACH ROW] 
[DECLARE variables] 
BEGIN 
  pl_sql_code 
[EXCEPTION exception_code] 
END; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algumas observações: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você não pode criar um gatilho AFTER DELETE em uma visualização, a menos que seja uma visualização de edição; &lt;/li&gt;
&lt;li&gt;Se você estiver executando um gatilho de instrução (omitindo a cláusula FOR EACH ROW), não poderá ler os valores :OLD; &lt;/li&gt;
&lt;li&gt;Se você estiver executando um gatilho de linha (usando FOR EACH ROW), poderá ler, mas não atualizar os valores :OLD. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quadro de vantagens e desvantagens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vantagens&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mantém todas as alterações sob controle – UPDATE, DELETE, INSERT- nas tabelas criadas, quando ocorre a inserção/alteração de dados nas tabelas de auditorias; &lt;/li&gt;
&lt;li&gt;Permitem uma replicação síncrona nas tabelas; &lt;/li&gt;
&lt;li&gt;Operam com autorizações/padrões de segurança nas tabelas; &lt;/li&gt;
&lt;li&gt;Fornecem alternativas para executar tarefas agendadas, já que, os triggers automaticamente auxiliam antes ou depois de uma alteração ser feita nos dados de uma tabela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Podem impactar no desempenho do sistema, como aumentar a sobrecarga do banco de dados; &lt;/li&gt;
&lt;li&gt;Só utilizam troubleshoots estendidas, o que invalida outras validações; &lt;/li&gt;
&lt;li&gt;Por usar triggers, caso tenha um uso excessivo e/ou seja um banco de dados grande, implica numa dificuldade de refatorar ou na manutenbilidade do sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usando Trigger SQL no Mercado&lt;/strong&gt;&lt;br&gt;
Por seguinte, exemplos de empresas que podem utilizar essa ferramenta, para regras, segurança e velocidade: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Entradas e atualizações de dados&lt;/strong&gt;&lt;br&gt;
A trigger, pode entrar em uso nesse caso, quando uma empresa de vendas (mercado livre), o qual tem muitas atualizações por causa das compras e mudanças nos valores. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mudanças de valores&lt;/strong&gt;&lt;br&gt;
A trigger, pode entrar em uso no caso de uma empresa de investimentos, pois a cada segundo os valores das bolsas são atualizados, sendo as funcionalidades do trigger são os eventos, possibilitando de configurar esses eventos para a cada segundo e verificar os campos dos valores. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verificar entradas inválidas&lt;/strong&gt;&lt;br&gt;
Um exemplo simples é uma empresa de finanças que tem entradas de valores constantes, onde é importante utilizar o trigger e as ferramentas dele, para verificação de campos inválidos e evitar não quebrar ou parar o banco de dados. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Geração de valores entres colunas&lt;/strong&gt;&lt;br&gt;
Um exemplo é uma empresa de cobrança, onde tem que pegar o valor e adicionar os juros, essa é uma utilização do trigger nesse caso. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sincronização entre tabelas&lt;/strong&gt;&lt;br&gt;
Exemplo de utilização é em uma empresa que tem o RH, e quando atualizar as informações dos usuários possam refletir em todos o sistema, como alteração de senha ou quando o usuário atualizar a senha, todos os sistemas da empresa devem atualizar essa atualização. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Considerações finais&lt;/strong&gt;&lt;br&gt;
Em síntese, as triggers são um componente fundamental e de grande importância no desempenho, automatização, gerenciamento e construção de banco de dados. Portanto, se trata de uma ferramenta muito útil ao construir e gerenciar um sistema, especialmente, quando se trata de controle. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências bibliográficas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://medium.com/edureka/triggers-in-sql-1c51b2bba4c1"&gt;https://medium.com/edureka/triggers-in-sql-1c51b2bba4c1&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/plsql-triggers.html#GUID-C08EA160-8FD2-4A10-9733-6F2D20C83E93"&gt;https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/plsql-triggers.html#GUID-C08EA160-8FD2-4A10-9733-6F2D20C83E93&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver16"&gt;https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver16&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.databasestar.com/oracle-triggers/#What_Are_Oracle_Triggers"&gt;https://www.databasestar.com/oracle-triggers/#What_Are_Oracle_Triggers&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>triggers</category>
      <category>oracle</category>
      <category>database</category>
      <category>oracledb</category>
    </item>
  </channel>
</rss>
