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
- Visões simples: reutilização lógica
- Visões atualizáveis e gatilhos INSTEAD OF
- Visões materializadas e estratégias de REFRESH
- Quando pré-agregar