SQL Academy · Lektion

Opdaterbare views og INSTEAD OF-triggers

Gør views direkte opdaterbare, eller brug INSTEAD OF-triggers, når viewet aggregerer eller joiner data.

Lektion 2 af 413 trin

Opdaterbare views og INSTEAD OF-triggers er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Automatisk opdaterbare views

PostgreSQL gør automatisk simple views opdaterbare. INSERT/UPDATE/DELETE på viewet omskrives til den samme handling på grundtabellen:

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.

Krav til automatisk opdatering

Viewet skal:

  • Referere til præcis ÉN grundtabel
  • Ikke have aggregater, GROUP BY, HAVING eller DISTINCT
  • Ikke have LIMIT eller OFFSET
  • Ikke have mængdeoperationer (UNION osv.)
  • Knytte kolonner direkte (ingen udtryk i SELECT-listen — eller kun nogle)

WITH CHECK OPTION

Forbyd skrivninger, der ville oprette rækker, som ikke er synlige i viewet:

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.

Komplekse views kræver INSTEAD OF

Views med JOINs, aggregater eller udtryk kan ikke opdateres automatisk. Du skal skrive en INSTEAD OF-trigger, der definerer, hvad en skrivning betyder:

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();

INSTEAD OF-triggerfunktion

Funktionen afgør, hvilke grundtabeller der skal skrives til:

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;

Hvornår INSTEAD OF slår applogik

Hvis mange forbrugere opdaterer viewet, giver centralisering af opdateringslogikken i en trigger ensartethed. Hvis kun én app opdaterer det, skal du beholde logikken i appkoden.

SECURITY BARRIER

Forhindr planlæggeren i at lække prædikater ind i ikke-betroede view-forbrugere (informationslækage via omkostninger):

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

Row-Level Security som alternativ

Moderne PostgreSQL understøtter også Row-Level Security (RLS) på grundtabeller — det er ofte renere end at opbygge sikkerhedsviews.

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

Rekursive views

PostgreSQL understøtter rekursive views (et hierarki, du kan udføre SELECT på):

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;

Rettigheder

Giv rettigheder på viewet, ikke grundtabellerne:

GRANT SELECT, UPDATE ON active_users TO app_user;

Bemærkning om ydeevne

En INSTEAD OF-trigger udløses for hver række. Ved masse-DML er det langsomt. Ofte er det bedre at lade de kaldende skrive direkte til grundtabellerne.

Opsamling

Views kan være skrivbare.

  • Simple views: opdateres automatisk
  • Komplekse views: INSTEAD OF-triggere
  • WITH CHECK OPTION håndhæver synlighed
  • RLS er ofte en renere sikkerhedsmodel

Hurtigt tjek

Du definerer et view, der JOINer to tabeller. Kan du som standard udføre UPDATE gennem det?

Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “Opdaterbare views og INSTEAD OF-triggers” gratis?

Ja — hele teksten til “Opdaterbare views og INSTEAD OF-triggers” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Opdaterbare views og INSTEAD OF-triggers”?

Gør views direkte opdaterbare, eller brug INSTEAD OF-triggers, når viewet aggregerer eller joiner data. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Opdaterbare views og INSTEAD OF-triggers”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Almindelige views: Logisk genbrug
  2. Opdaterbare views og INSTEAD OF-triggers
  3. Materialiserede views og REFRESH-strategier
  4. Hvornår skal De præaggregere
← Tilbage til SQL Academy