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
Quizzes & Challenges
Quizzes
Challenges
/
Otimização de SQL e Recursos de Consulta

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.

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 execução da ação (inserção, atualização, exclusão) na tabela;
  • Before Triggers: Esses triggers são disparados antes da execução da ação. Eles 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 de INSERT dentro da tabela BankAccounts.
Como resultado, só será possível inserir novas contas, e o valor correspondente do log será adicionado automaticamente pelo trigger.

12345678910111213141516
-- 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();
copy
Note
Nota

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 da 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 trigger BEFORE

Suponha que desejamos impedir a inserção de valores com saldo de conta negativo. Podemos criar um trigger BEFORE para alcançar esse objetivo. Esse trigger irá verificar o saldo antes da operação e, se for negativo, a operação não será realizada.

12345678910111213141516171819202122232425
-- 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();
copy

Padrão de criação de triggers

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 um 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 de utilizar 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

Awesome!

Completion rate improved to 4.55

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.

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 execução da ação (inserção, atualização, exclusão) na tabela;
  • Before Triggers: Esses triggers são disparados antes da execução da ação. Eles 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 de INSERT dentro da tabela BankAccounts.
Como resultado, só será possível inserir novas contas, e o valor correspondente do log será adicionado automaticamente pelo trigger.

12345678910111213141516
-- 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();
copy
Note
Nota

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 da 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 trigger BEFORE

Suponha que desejamos impedir a inserção de valores com saldo de conta negativo. Podemos criar um trigger BEFORE para alcançar esse objetivo. Esse trigger irá verificar o saldo antes da operação e, se for negativo, a operação não será realizada.

12345678910111213141516171819202122232425
-- 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();
copy

Padrão de criação de triggers

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 um 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 de utilizar 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