Pular para o conteúdo principal
Documentos
Sintaxe básicaFunções JSONAcionadoresGerenciamento de tabelas e esquemasFunções de cadeia de caracteresFunções matemáticasFunções de dataBancos de dadosÍndices

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.