0Pricing
SQL Academy · Aula

Visões atualizáveis e gatilhos INSTEAD OF

Torne as visões diretamente atualizáveis ou use gatilhos INSTEAD OF quando a visão agregar ou combinar dados.

Visões atualizáveis e gatilhos INSTEAD OF é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.

Visualizações atualizáveis automaticamente

O PostgreSQL torna automaticamente atualizáveis as visualizações simples. As operações INSERT/UPDATE/DELETE na visualização são reescritas como a mesma operação na tabela base:

CREATE VIEW active_users AS
  SELECT id, email, full_name FROM users WHERE deleted_at IS NULL;

UPDATE active_users SET full_name = 'Alice' WHERE id = 1;
-- Translates to UPDATE on the users table.

Requisitos para atualização automática

A visualização deve:

  • Referenciar exatamente ONE tabela base
  • Não ter agregações, GROUP BY, HAVING ou DISTINCT
  • Não ter LIMIT ou OFFSET
  • Não ter operações de conjunto (UNION etc.)
  • Mapear as colunas diretamente (sem expressões na lista SELECT — ou apenas algumas)

WITH CHECK OPTION

Impeça gravações que criariam linhas invisíveis para a visualização:

CREATE VIEW active_users AS
  SELECT * FROM users WHERE deleted_at IS NULL
  WITH CHECK OPTION;

INSERT INTO active_users (email, deleted_at) VALUES (..., NOW());
-- ERROR — would create a row outside the view's WHERE.

Visualizações complexas precisam de INSTEAD OF

Visualizações com JOIN, agregações ou expressões não são atualizáveis automaticamente. É necessário escrever um gatilho INSTEAD OF que defina o significado da gravação:

CREATE VIEW user_with_address AS
  SELECT u.id, u.email, a.city, a.country
  FROM users u JOIN addresses a ON a.user_id = u.id;

CREATE TRIGGER user_addr_update
INSTEAD OF UPDATE ON user_with_address
FOR EACH ROW EXECUTE FUNCTION update_user_addr();

Função de gatilho INSTEAD OF

A função decide em quais tabelas base gravar:

CREATE FUNCTION update_user_addr() RETURNS TRIGGER AS $$
BEGIN
  UPDATE users SET email = NEW.email WHERE id = NEW.id;
  UPDATE addresses SET city = NEW.city, country = NEW.country WHERE user_id = NEW.id;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Quando INSTEAD OF é melhor que a lógica do aplicativo

Se muitos consumidores atualizarem a visualização, centralizar a lógica de atualização em um gatilho proporciona consistência. Se apenas um aplicativo atualizar, mantenha a lógica no código do aplicativo.

SECURITY BARRIER

Impeça o planejador de inserir predicados em consumidores não confiáveis da visualização (vazamento de informações por meio do custo):

CREATE VIEW my_things AS
SELECT * FROM things WHERE owner_id = current_user_id()
WITH (security_barrier);

Segurança em nível de linha como alternativa

O PostgreSQL também oferece suporte moderno a RLS nas tabelas base — geralmente mais simples do que criar visualizações de segurança.

ALTER TABLE things ENABLE ROW LEVEL SECURITY;
CREATE POLICY owner_only ON things USING (owner_id = current_user_id());

Visualizações recursivas

O PostgreSQL oferece suporte a visualizações recursivas (uma hierarquia da qual pode fazer SELECT):

CREATE RECURSIVE VIEW tree (id, parent_id, depth) AS
  SELECT id, parent_id, 0 FROM nodes WHERE parent_id IS NULL
  UNION ALL
  SELECT n.id, n.parent_id, t.depth + 1
  FROM nodes n JOIN tree t ON n.parent_id = t.id;

Permissões

Conceda permissões na visualização, não nas tabelas base:

GRANT SELECT, UPDATE ON active_users TO app_user;

Observação sobre desempenho

Um gatilho INSTEAD OF é disparado por linha. Para DML em massa, isso é lento. Muitas vezes, é melhor que os chamadores gravem diretamente nas tabelas base.

Recapitulação

As visualizações podem ser graváveis.

  • Visualizações simples: atualizáveis automaticamente
  • Visualizações complexas: gatilhos INSTEAD OF
  • WITH CHECK OPTION impõe a visibilidade
  • RLS costuma ser um modelo de segurança mais simples

Verificação rápida

Você define uma visualização que une duas tabelas. Pode atualizá-la por padrão?

Perguntas Frequentes

A aula “Visões atualizáveis e gatilhos INSTEAD OF” é grátis?

Sim — o texto completo de “Visões atualizáveis e gatilhos INSTEAD OF” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.

O que vou aprender em “Visões atualizáveis e gatilhos INSTEAD OF”?

Torne as visões diretamente atualizáveis ou use gatilhos INSTEAD OF quando a visão agregar ou combinar dados. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Academy?

Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Visões atualizáveis e gatilhos INSTEAD OF”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Academy?

Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Visões simples: reutilização lógica
  2. Visões atualizáveis e gatilhos INSTEAD OF
  3. Visões materializadas e estratégias de REFRESH
  4. Quando pré-agregar
← Voltar para SQL Academy