PostgreSQL em vez de acionadores
Os gatilhos no PostgreSQL são procedimentos especiais que são executados automaticamente em resposta a determinados eventos em uma tabela ou visualização. O acionador `INSTEAD OF` permite especificamente que você defina um comportamento personalizado para ações como `INSERT`, `UPDATE` ou `DELETE` em exibições.
Uso
Os acionadores `INSTEAD OF` são usados quando você precisa substituir a ação padrão em uma visualização, permitindo efetivamente a lógica complexa ou a manipulação de dados que não é diretamente suportada pelas operações SQL padrão. Esses acionadores são definidos para ocorrer "DENTRO" do evento acionador. Observe que os acionadores `INSTEAD OF` são aplicáveis apenas a exibições e não a tabelas.
CREATE TRIGGER trigger_name
INSTEAD OF {INSERT | UPDATE | DELETE}
ON view_name
FOR EACH ROW
EXECUTE FUNCTION function_name();
Nessa sintaxe, `INSTEAD OF` especifica que o acionador substituirá a operação padrão na visualização especificada pela lógica definida em `function_name`. Os registros `NEW` e `OLD` nas funções de acionamento representam os novos dados para um `INSERT` ou `UPDATE` e os dados existentes para `UPDATE` ou `DELETE`, respectivamente.
Exemplos
1. Acionador básico INSTEAD OF INSERT
CREATE FUNCTION insert_employee()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO employees (id, name)
VALUES (NEW.id, NEW.name);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER insert_employee_trigger
INSTEAD OF INSERT ON employees_view
FOR EACH ROW
EXECUTE FUNCTION insert_employee();
Esse exemplo define um acionador `INSTEAD OF INSERT` que insere dados na tabela `employees` quando há uma tentativa de inserção em `employees_view`.
2. Acionador INSTEAD OF UPDATE
CREATE FUNCTION update_employee_name()
RETURNS TRIGGER AS $$
BEGIN
UPDATE employees
SET name = NEW.name
WHERE id = OLD.id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_employee_trigger
INSTEAD OF UPDATE ON employees_view
FOR EACH ROW
EXECUTE FUNCTION update_employee_name();
Esse acionador substitui uma atualização em `employees_view` por uma atualização em `employees`, alterando o campo `name` com base nas alterações da visualização.
3. Acionador INSTEAD OF DELETE
CREATE FUNCTION delete_employee()
RETURNS TRIGGER AS $$
BEGIN
DELETE FROM employees
WHERE id = OLD.id;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER delete_employee_trigger
INSTEAD OF DELETE ON employees_view
FOR EACH ROW
EXECUTE FUNCTION delete_employee();
O acionador trata as exclusões na `employees_view` excluindo a entrada correspondente na tabela `employees`.
Dicas e práticas recomendadas
- Uso com visualizações. Os acionadores `INSTEAD OF` são mais úteis com visualizações, pois permitem que você defina como as operações em uma visualização se traduzem em tabelas base.
- Garanta a correção da função. A função usada no acionador deve tratar todos os casos possíveis da operação para evitar comportamentos inesperados.
- Teste os acionadores minuciosamente. Como os acionadores podem alterar o comportamento padrão, é fundamental realizar testes completos para garantir que eles funcionem conforme o esperado.
- Use as transações. Considere o uso de transações nas funções de acionamento para manter a integridade dos dados, especialmente quando a operação envolver várias etapas.
- Documente seus gatilhos. A documentação clara ajuda a manter a legibilidade do código e auxilia outros desenvolvedores a entender a lógica personalizada.
- Considere as implicações de desempenho. Esteja ciente de que a lógica complexa nos acionadores `INSTEAD OF` pode gerar sobrecarga de desempenho, portanto, otimize as funções de acionamento para obter eficiência.
Considerações adicionais
- Casos de uso. Os acionadores `INSTEAD OF` são particularmente úteis para lidar com a lógica de visualização complexa que não pode ser expressa diretamente em SQL.
- Informações sobre a versão. Os triggers `INSTEAD OF` foram introduzidos na versão 9.1 do PostgreSQL, o que é importante para a compatibilidade com sistemas mais antigos.