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.
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.
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
CREATEFUNCTIONupdate_employee_name()RETURNSTRIGGERAS $$
BEGINUPDATE employees
SET name =NEW.name
WHERE id =OLD.id;RETURNNEW;END;
$$ LANGUAGE plpgsql;CREATETRIGGER update_employee_trigger
INSTEADOFUPDATEON employees_view
FOREACHROWEXECUTEFUNCTIONupdate_employee_name();Tecnologia
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
CREATEFUNCTIONdelete_employee()RETURNSTRIGGERAS $$
BEGINDELETEFROM employees
WHERE id =OLD.id;RETURNOLD;END;
$$ LANGUAGE plpgsql;CREATETRIGGER delete_employee_trigger
INSTEADOFDELETEON employees_view
FOREACHROWEXECUTEFUNCTIONdelete_employee();Tecnologia
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.
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.
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
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
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
O acionador trata as exclusões na `employees_view` excluindo a entrada correspondente na tabela `employees`.
Dicas e práticas recomendadas
Considerações adicionais