Gatilhos
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 usados para aplicar 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();
-
Criar um trigger after insert para user_logs:
- Criar uma função chamada
afterinserttriggerfunction(). - A função é definida para retornar um trigger.
- O corpo da função começa com um bloco
BEGIN. - Dentro do bloco
BEGIN, uma ação é realizada, que é a inserção de um registro na tabelauserlogs. - O registro inserido contém valores da linha
NEWdo evento que disparou o trigger. - Os valores inseridos incluem
accountnumbere uma string concatenada mencionando a ação. - A função retorna a linha
NEW. - A função é escrita na linguagem
plpgsql.
- Criar uma função chamada
-
Anexar o trigger à tabela bankaccounts:
- Um trigger chamado
afterinserttriggeré criado. - O trigger é configurado para ser executado após uma operação de
INSERTna tabelabankaccounts. - O trigger é configurado para executar a função
afterinserttriggerfunctionpara cada linha afetada.
- Um trigger chamado
Em triggers do PostgreSQL, NEW é uma variável de registro especial que representa a nova linha inserida ou atualizada na tabela. 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 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.
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();
-
Criar a função de trigger:
- Criar ou substituir uma função chamada
before_insert_userlogs(). - A função é definida para retornar um trigger.
- O corpo da função começa com um bloco
BEGIN. - Dentro do bloco
BEGIN, uma condição verifica se o saldo da conta é menor que 0. - Se o saldo for menor que 0, um aviso é emitido e nenhuma ação é registrada. A função retorna NULL para impedir a inserção.
- Se o saldo for maior ou igual a 0, um aviso é emitido indicando que a ação foi registrada.
- Em seguida, a função insere um registro na tabela
userlogs, contendo valores da nova linha (NEW). - Os valores inseridos incluem
accountnumbere uma string concatenada indicando a ação. - A função retorna
NEWpara permitir que a inserção prossiga. - A função é escrita na linguagem
plpgsql.
- Criar ou substituir uma função chamada
-
Criar o trigger:
- Um trigger chamado
before_insert_userlogs_triggeré criado. - O trigger é configurado para ser executado antes de uma operação
INSERTna tabelabankaccounts. - O trigger é configurado para executar a função
before_insert_userlogs()para cada linha afetada.
- Um trigger chamado
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 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 que não podemos criar triggers para SELECT, pois a instrução SELECT não modifica nenhuma linha na tabela!
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Gatilhos
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 usados para aplicar 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();
-
Criar um trigger after insert para user_logs:
- Criar uma função chamada
afterinserttriggerfunction(). - A função é definida para retornar um trigger.
- O corpo da função começa com um bloco
BEGIN. - Dentro do bloco
BEGIN, uma ação é realizada, que é a inserção de um registro na tabelauserlogs. - O registro inserido contém valores da linha
NEWdo evento que disparou o trigger. - Os valores inseridos incluem
accountnumbere uma string concatenada mencionando a ação. - A função retorna a linha
NEW. - A função é escrita na linguagem
plpgsql.
- Criar uma função chamada
-
Anexar o trigger à tabela bankaccounts:
- Um trigger chamado
afterinserttriggeré criado. - O trigger é configurado para ser executado após uma operação de
INSERTna tabelabankaccounts. - O trigger é configurado para executar a função
afterinserttriggerfunctionpara cada linha afetada.
- Um trigger chamado
Em triggers do PostgreSQL, NEW é uma variável de registro especial que representa a nova linha inserida ou atualizada na tabela. 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 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.
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();
-
Criar a função de trigger:
- Criar ou substituir uma função chamada
before_insert_userlogs(). - A função é definida para retornar um trigger.
- O corpo da função começa com um bloco
BEGIN. - Dentro do bloco
BEGIN, uma condição verifica se o saldo da conta é menor que 0. - Se o saldo for menor que 0, um aviso é emitido e nenhuma ação é registrada. A função retorna NULL para impedir a inserção.
- Se o saldo for maior ou igual a 0, um aviso é emitido indicando que a ação foi registrada.
- Em seguida, a função insere um registro na tabela
userlogs, contendo valores da nova linha (NEW). - Os valores inseridos incluem
accountnumbere uma string concatenada indicando a ação. - A função retorna
NEWpara permitir que a inserção prossiga. - A função é escrita na linguagem
plpgsql.
- Criar ou substituir uma função chamada
-
Criar o trigger:
- Um trigger chamado
before_insert_userlogs_triggeré criado. - O trigger é configurado para ser executado antes de uma operação
INSERTna tabelabankaccounts. - O trigger é configurado para executar a função
before_insert_userlogs()para cada linha afetada.
- Um trigger chamado
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 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 que não podemos criar triggers para SELECT, pois a instrução SELECT não modifica nenhuma linha na tabela!
Obrigado pelo seu feedback!