MySQL ANTES do gatilho UPDATE

Resumo : neste tutorial, você aprenderá como criar um BEFORE UPDATEgatilho MySQL para validar dados antes que eles sejam atualizados em uma tabela.

Introdução aos gatilhos MySQL BEFORE UPDATE

BEFORE UPDATE Os gatilhos MySQL são invocados automaticamente antes que um evento de atualização ocorra na tabela associada aos gatilhos.

Aqui está a sintaxe para criar um BEFORE UPDATEgatilho MySQL:

CREATE TRIGGER trigger_name
BEFORE UPDATE
ON table_name FOR EACH ROW
trigger_bodyLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe:

Primeiro, especifique o nome do gatilho que deseja criar após as CREATE TRIGGERpalavras-chave.

Segundo, use BEFORE UPDATEa cláusula para especificar o horário para invocar o gatilho.

Terceiro, especifique o nome da tabela à qual o gatilho pertence após a ONpalavra-chave.

Finalmente, especifique o corpo do gatilho que contém uma ou mais instruções.

Se você tiver mais de uma instrução no trigger_body, precisará usar o BEGIN ENDbloco. Além disso, você precisa alterar o delimitador padrão da seguinte forma:

DELIMITER $$

CREATE TRIGGER trigger_name
    BEFORE UPDATE
    ON table_name FOR EACH ROW
BEGIN
    -- statements
END$$    

DELIMITER ;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Em um BEFORE UPDATEgatilho, você pode atualizar os NEWvalores, mas não pode atualizá- OLDlos.

MySQL ANTES do gatilho UPDATE

Exemplo de gatilho MySQL BEFORE UPDATE

Vejamos um exemplo de uso de um BEFORE UPDATEgatilho.

Configurando uma tabela de exemplo

Primeiro, crie uma nova tabela chamada salespara armazenar volumes de vendas:

DROP TABLE IF EXISTS sales;

CREATE TABLE sales (
    id INT AUTO_INCREMENT,
    product VARCHAR(100) NOT NULL,
    quantity INT NOT NULL DEFAULT 0,
    fiscalYear SMALLINT NOT NULL,
    fiscalMonth TINYINT NOT NULL,
    CHECK(fiscalMonth >= 1 AND fiscalMonth <= 12),
    CHECK(fiscalYear BETWEEN 2000 and 2050),
    CHECK (quantity >=0),
    UNIQUE(product, fiscalYear, fiscalMonth),
    PRIMARY KEY(id)
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, insira algumas linhas na salestabela:

INSERT INTO sales(product, quantity, fiscalYear, fiscalMonth)
VALUES
    ('2003 Harley-Davidson Eagle Drag Bike',120, 2020,1),
    ('1969 Corvair Monza', 150,2020,1),
    ('1970 Plymouth Hemi Cuda', 200,2020,1);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, consulte os dados da salestabela para verificar a inserção:

SELECT * FROM sales;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Gatilho MySQL BEFORE UPDATE - Tabela de exemplo

Criando exemplo de gatilho BEFORE UPDATE

A instrução a seguir cria um BEFORE UPDATEgatilho na salestabela.

DELIMITER $$

CREATE TRIGGER before_sales_update
BEFORE UPDATE
ON sales FOR EACH ROW
BEGIN
    DECLARE errorMessage VARCHAR(255);
    SET errorMessage = CONCAT('The new quantity ',
                        NEW.quantity,
                        ' cannot be 3 times greater than the current quantity ',
                        OLD.quantity);
                        
    IF new.quantity > old.quantity * 3 THEN
        SIGNAL SQLSTATE '45000' 
            SET MESSAGE_TEXT = errorMessage;
    END IF;
END $$

DELIMITER ;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

O gatilho é disparado automaticamente antes que ocorra um evento de atualização para cada linha da salestabela.

Se você atualizar o valor na quantitycoluna para um novo valor três vezes maior que o valor atual, o gatilho gerará um erro e interromperá a atualização.

Vamos examinar o gatilho em detalhes:

Primeiro, o nome do gatilho é before_sales_updateespecificado na CREATE TRIGGERcláusula:

CREATE TRIGGER before_sales_updateLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Em segundo lugar, o evento desencadeador é:

BEFORE UPDATELinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, a tabela à qual o gatilho está associado é sales:

ON sales FOR EACH ROWLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Quarto, declare uma variável e defina seu valor como uma mensagem de erro. Observe que, no BEFORE TRIGGER, você pode acessar os valores antigos e novos das colunas por meio de modificadores OLDe NEW.

DECLARE errorMessage VARCHAR(255);
SET errorMessage = CONCAT('The new quantity ',
                        NEW.quantity,
                        ' cannot be 3 times greater than the current quantity ',
                        OLD.quantity);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Observe que usamos a CONCAT()função para formar a mensagem de erro.

Por fim, use a IF-THENinstrução para verificar se o novo valor é 3 vezes maior que o valor antigo e, em seguida, gere um erro usando a SIGNALinstrução:

IF new.quantity > old.quantity * 3 THEN
        SIGNAL SQLSTATE '45000' 
            SET MESSAGE_TEXT = errorMessage;
END IF;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Testando o gatilho MySQL BEFORE UPDATE

Primeiro, atualize a quantidade da linha com id 1 para 150:

UPDATE sales 
SET quantity = 150
WHERE id = 1;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Funcionou porque a nova quantidade não infringiu a regra.

Segundo, consulte os dados da salestabela para verificar a atualização:

SELECT * FROM sales;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Exemplo de gatilho MySQL BEFORE UPDATE

Terceiro, atualize a quantidade da linha com id 1 para 500:

UPDATE sales 
SET quantity = 500
WHERE id = 1;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

MySQL emitiu este erro:

Error Code: 1644. The new quantity 500 cannot be 3 times greater than the current quantity 150
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesse caso, o acionador constatou que a nova quantidade causou violação e gerou erro.

Finalmente, use o SHOW ERRORSpara exibir o erro:

SHOW ERRORS;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Gatilho MySQL BEFORE UPDATE - MOSTRAR ERROS

Neste tutorial, você aprendeu como criar um BEFORE UPDATEgatilho MySQL para validar dados antes de serem atualizados em uma tabela.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *