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.
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 registroOLD
em vez deNEW
.
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!
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
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
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.
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 registroOLD
em vez deNEW
.
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!
Obrigado pelo seu feedback!