Viste aggiornabili e trigger INSTEAD OF
Renda le viste direttamente aggiornabili oppure utilizzi trigger INSTEAD OF quando la vista aggrega o unisce dati.
Viste aggiornabili e trigger INSTEAD OF è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.
Viste aggiornabili automaticamente
PostgreSQL rende automaticamente aggiornabili le viste semplici. INSERT/UPDATE/DELETE sulla vista viene riscritto come la stessa operazione sulla tabella di 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.Requisiti per l'aggiornamento automatico
La vista deve:
- Fare riferimento a esattamente UNA tabella di base
- Non contenere aggregazioni, GROUP BY, HAVING o DISTINCT
- Non contenere LIMIT o OFFSET
- Non contenere operazioni tra insiemi (UNION ecc.)
- Mappare direttamente le colonne (nessuna espressione nell'elenco SELECT, oppure solo alcune)
WITH CHECK OPTION
Impedisca le scritture che creerebbero righe non visibili nella vista:
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.Per le viste complesse serve INSTEAD OF
Le viste con join, aggregazioni o espressioni non sono aggiornabili automaticamente. Deve scrivere un trigger INSTEAD OF che definisca il significato delle operazioni di scrittura:
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();Funzione trigger INSTEAD OF
La funzione decide in quali tabelle di base scrivere:
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 è preferibile alla logica dell'applicazione
Se molti consumer aggiornano la vista, centralizzare la logica di aggiornamento in un trigger garantisce coerenza. Se l'aggiornamento è eseguito da una sola applicazione, mantenga la logica nel codice dell'applicazione.
SECURITY BARRIER
Impedisca al planner di propagare i predicati nei consumer non affidabili della vista, evitando fughe di informazioni attraverso il costo:
CREATE VIEW my_things AS
SELECT * FROM things WHERE owner_id = current_user_id()
WITH (security_barrier);Row-Level Security come alternativa
Le versioni moderne di PostgreSQL supportano anche Row-Level Security (RLS) sulle tabelle di base: spesso è più pulita rispetto alla costruzione di viste di sicurezza.
ALTER TABLE things ENABLE ROW LEVEL SECURITY;
CREATE POLICY owner_only ON things USING (owner_id = current_user_id());Viste ricorsive
PostgreSQL supporta le viste ricorsive, ad esempio una gerarchia dalla quale è possibile eseguire 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;Autorizzazioni
Conceda le autorizzazioni sulla vista, non sulle tabelle di base:
GRANT SELECT, UPDATE ON active_users TO app_user;Nota sulle prestazioni
Un trigger INSTEAD OF viene attivato per ogni riga. Per operazioni DML massive è lento. Spesso è preferibile che i chiamanti scrivano direttamente nelle tabelle di base.
Riepilogo
Le viste possono essere scrivibili.
- Viste semplici: aggiornabili automaticamente
- Viste complesse: trigger INSTEAD OF
- WITH CHECK OPTION impone la visibilità
- RLS è spesso un modello di sicurezza più pulito
Verifica rapida
Definisce una vista che unisce due tabelle. Può eseguire UPDATE tramite essa per impostazione predefinita?
Domande Frequenti
La lezione «Viste aggiornabili e trigger INSTEAD OF» è gratuita?
Sì — il testo completo di «Viste aggiornabili e trigger INSTEAD OF» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.
Cosa imparerò in «Viste aggiornabili e trigger INSTEAD OF»?
Renda le viste direttamente aggiornabili oppure utilizzi trigger INSTEAD OF quando la vista aggrega o unisce dati. Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Academy?
Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Viste aggiornabili e trigger INSTEAD OF»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Academy?
Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Viste semplici: riutilizzo logico
- Viste aggiornabili e trigger INSTEAD OF
- Viste materializzate e strategie di REFRESH
- Quando preaggregare