0Pricing
SQL Academy · Lezione

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

  1. Viste semplici: riutilizzo logico
  2. Viste aggiornabili e trigger INSTEAD OF
  3. Viste materializzate e strategie di REFRESH
  4. Quando preaggregare
← Torna a SQL Academy