Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Gatilhos | Alguns Tópicos Adicionais
Técnicas Avançadas em SQL

bookGatilhos

Triggers em bancos de dados são tipos especiais de procedimentos armazenados que são executados automaticamente ou disparados em resposta a determinados eventos ou ações que ocorrem no banco de dados.
Esses eventos podem incluir inserções, atualizações ou exclusões de dados em tabelas e alterações em objetos de esquema do banco de dados, como tabelas ou views.

Note

Triggers não podem ser invocados explicitamente pelos usuários. Em vez disso, são executados automaticamente em resposta às operações às quais estão associados.

Triggers DML

Um trigger DML, também conhecido como trigger de Linguagem de Manipulação de Dados, é um objeto de banco de dados que executa automaticamente uma ação especificada quando um determinado evento ocorre em uma tabela ou view.
Triggers DML são frequentemente utilizados para impor regras de negócio, manter a integridade dos dados ou realizar tarefas de auditoria.

Tipos de triggers DML

  • After Triggers: Esses triggers são disparados após a ação que os disparou (insert, update, delete) ter sido executada na tabela;
  • Before Triggers: Esses triggers são disparados antes da ação que os disparou. Permitem interceptar a ação original e executar lógica personalizada antes de decidir se a ação original deve ou não ser realizada.

Exemplo de after trigger

Já exploramos anteriormente um exemplo de uso de transação para adicionar valores à tabela BankAccounts e à tabela UserLogs como uma única unidade lógica na primeira seção deste curso.
Agora, em vez de usar uma transação, podemos alcançar isso criando um trigger AFTER na operação INSERT dentro da tabela BankAccounts.
Como resultado, só será possível inserir novas contas, e o valor correspondente de log será adicionado automaticamente pelo trigger.

-- Create an after-insert trigger for UserLogs
CREATE FUNCTION after_insert_trigger_function()
RETURNS TRIGGER AS $$
BEGIN
    -- Perform some action, like logging the insert
    INSERT INTO UserLogs (account_number, action)
    VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder));
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Attach the trigger to the BankAccounts table
CREATE TRIGGER after_insert_trigger
AFTER INSERT ON BankAccounts
FOR EACH ROW
EXECUTE PROCEDURE after_insert_trigger_function();

Note

Em triggers do PostgreSQL, NEW é uma variável de registro especial que representa a nova linha inserida ou atualizada na tabela. Ela permite acessar os valores das colunas na nova linha dentro da função do trigger.
Se estivermos trabalhando com linhas excluídas, devemos usar a variável de registro OLD em vez de NEW.

Exemplo de before trigger

Suponha que queremos impedir a adição de valores com saldo de conta negativo. Podemos criar um trigger BEFORE para isso. Esse trigger irá verificar o saldo antes da operação e, se for negativo, a operação não será realizada.

-- Create the trigger function
CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$
BEGIN
    -- Check if the account balance is less than 0
    IF (NEW.balance < 0) THEN
        -- If balance is less than 0, do nothing and return
        RAISE NOTICE 'Balance is less than 0. Action not logged.';
    ELSE
        -- If balance is greater than or equal to 0, log the action
        RAISE NOTICE 'Logging insert into UserLogs';
        -- Inserting into the UserLogs table
        INSERT INTO UserLogs (account_number, action)
        VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder));
    END IF;

    -- Indicate that the trigger function has completed successfully
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

-- Create the trigger
CREATE TRIGGER before_insert_trigger
BEFORE INSERT ON BankAccounts
FOR EACH ROW
EXECUTE PROCEDURE before_insert_trigger_function();

Padrão de criação de trigger

Podemos observar o padrão típico para criação de triggers: inicialmente, definimos uma função para executar uma lógica específica antes ou depois de uma operação. Em seguida, associamos essa função como uma trigger a uma tabela e ação designadas.

Observe que, na instrução:

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

temos a flexibilidade de utilizar UPDATE ou DELETE no lugar da operação INSERT.
Mas atenção: não é possível criar triggers para SELECT, pois a instrução SELECT não modifica nenhuma linha na tabela!

question mark

Qual é o principal objetivo do uso de triggers em um banco de dados?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 1

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Suggested prompts:

Can you explain the difference between AFTER and BEFORE triggers in more detail?

What are some common use cases for DML triggers in real-world applications?

How do I prevent unwanted actions using triggers in PostgreSQL?

Awesome!

Completion rate improved to 4.35

bookGatilhos

Deslize para mostrar o menu

Triggers em bancos de dados são tipos especiais de procedimentos armazenados que são executados automaticamente ou disparados em resposta a determinados eventos ou ações que ocorrem no banco de dados.
Esses eventos podem incluir inserções, atualizações ou exclusões de dados em tabelas e alterações em objetos de esquema do banco de dados, como tabelas ou views.

Note

Triggers não podem ser invocados explicitamente pelos usuários. Em vez disso, são executados automaticamente em resposta às operações às quais estão associados.

Triggers DML

Um trigger DML, também conhecido como trigger de Linguagem de Manipulação de Dados, é um objeto de banco de dados que executa automaticamente uma ação especificada quando um determinado evento ocorre em uma tabela ou view.
Triggers DML são frequentemente utilizados para impor regras de negócio, manter a integridade dos dados ou realizar tarefas de auditoria.

Tipos de triggers DML

  • After Triggers: Esses triggers são disparados após a ação que os disparou (insert, update, delete) ter sido executada na tabela;
  • Before Triggers: Esses triggers são disparados antes da ação que os disparou. Permitem interceptar a ação original e executar lógica personalizada antes de decidir se a ação original deve ou não ser realizada.

Exemplo de after trigger

Já exploramos anteriormente um exemplo de uso de transação para adicionar valores à tabela BankAccounts e à tabela UserLogs como uma única unidade lógica na primeira seção deste curso.
Agora, em vez de usar uma transação, podemos alcançar isso criando um trigger AFTER na operação INSERT dentro da tabela BankAccounts.
Como resultado, só será possível inserir novas contas, e o valor correspondente de log será adicionado automaticamente pelo trigger.

-- Create an after-insert trigger for UserLogs
CREATE FUNCTION after_insert_trigger_function()
RETURNS TRIGGER AS $$
BEGIN
    -- Perform some action, like logging the insert
    INSERT INTO UserLogs (account_number, action)
    VALUES (NEW.account_number, CONCAT('New record inserted for ', NEW.account_holder));
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Attach the trigger to the BankAccounts table
CREATE TRIGGER after_insert_trigger
AFTER INSERT ON BankAccounts
FOR EACH ROW
EXECUTE PROCEDURE after_insert_trigger_function();

Note

Em triggers do PostgreSQL, NEW é uma variável de registro especial que representa a nova linha inserida ou atualizada na tabela. Ela permite acessar os valores das colunas na nova linha dentro da função do trigger.
Se estivermos trabalhando com linhas excluídas, devemos usar a variável de registro OLD em vez de NEW.

Exemplo de before trigger

Suponha que queremos impedir a adição de valores com saldo de conta negativo. Podemos criar um trigger BEFORE para isso. Esse trigger irá verificar o saldo antes da operação e, se for negativo, a operação não será realizada.

-- Create the trigger function
CREATE FUNCTION before_insert_trigger_function() RETURNS TRIGGER AS $$
BEGIN
    -- Check if the account balance is less than 0
    IF (NEW.balance < 0) THEN
        -- If balance is less than 0, do nothing and return
        RAISE NOTICE 'Balance is less than 0. Action not logged.';
    ELSE
        -- If balance is greater than or equal to 0, log the action
        RAISE NOTICE 'Logging insert into UserLogs';
        -- Inserting into the UserLogs table
        INSERT INTO UserLogs (account_number, action)
        VALUES (NEW.account_number, CONCAT('Account created for ', NEW.account_holder));
    END IF;

    -- Indicate that the trigger function has completed successfully
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

-- Create the trigger
CREATE TRIGGER before_insert_trigger
BEFORE INSERT ON BankAccounts
FOR EACH ROW
EXECUTE PROCEDURE before_insert_trigger_function();

Padrão de criação de trigger

Podemos observar o padrão típico para criação de triggers: inicialmente, definimos uma função para executar uma lógica específica antes ou depois de uma operação. Em seguida, associamos essa função como uma trigger a uma tabela e ação designadas.

Observe que, na instrução:

CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
EXECUTE PROCEDURE proc_name;

temos a flexibilidade de utilizar UPDATE ou DELETE no lugar da operação INSERT.
Mas atenção: não é possível criar triggers para SELECT, pois a instrução SELECT não modifica nenhuma linha na tabela!

question mark

Qual é o principal objetivo do uso de triggers em um banco de dados?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 1
some-alt