Aktualisierbare Views und INSTEAD-OF-Trigger
Machen Sie Views direkt aktualisierbar oder verwenden Sie INSTEAD-OF-Trigger, wenn die View Daten aggregiert oder verknüpft.
Aktualisierbare Views und INSTEAD-OF-Trigger ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Automatisch aktualisierbare Views
PostgreSQL macht einfache Views automatisch aktualisierbar. INSERT/UPDATE/DELETE auf der View wird als derselbe Vorgang auf der Basistabelle umgeschrieben:
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.Voraussetzungen für die automatische Aktualisierbarkeit
Die View muss:
- genau EINE Basistabelle referenzieren
- keine Aggregationen, kein GROUP BY, HAVING oder DISTINCT enthalten
- kein LIMIT oder OFFSET enthalten
- keine Mengenoperationen (UNION usw.) enthalten
- Spalten direkt abbilden (keine Ausdrücke in der SELECT-Liste – oder nur in einigen Spalten)
WITH CHECK OPTION
Schreibvorgänge verhindern, durch die Zeilen entstehen würden, die in der View nicht sichtbar sind:
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.Komplexe Views benötigen INSTEAD OF
Views mit Joins, Aggregationen oder Ausdrücken sind nicht automatisch aktualisierbar. Sie müssen einen INSTEAD OF-Trigger schreiben, der festlegt, was ein Schreibvorgang bedeutet:
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
Die Funktion entscheidet, in welche Basistabellen geschrieben wird:
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;Wann INSTEAD OF die Anwendungslogik übertrifft
Wenn viele Verbraucher die View aktualisieren, sorgt eine Zentralisierung der Aktualisierungslogik in einem Trigger für Konsistenz. Wenn nur eine Anwendung aktualisiert, sollten Sie die Logik im Anwendungscode belassen.
SECURITY BARRIER
Verhindert, dass der Abfrageplaner Prädikate in nicht vertrauenswürdige View-Verbraucher durchreicht und dadurch Informationen über Kosten preisgibt:
CREATE VIEW my_things AS
SELECT * FROM things WHERE owner_id = current_user_id()
WITH (security_barrier);Row-Level Security als Alternative
Modernes PostgreSQL unterstützt außerdem Row-Level Security (RLS) für Basistabellen – oft eine klarere Lösung als der Aufbau von Security-Views.
ALTER TABLE things ENABLE ROW LEVEL SECURITY;
CREATE POLICY owner_only ON things USING (owner_id = current_user_id());Rekursive Views
PostgreSQL unterstützt rekursive Views, aus denen Sie beispielsweise eine Hierarchie abfragen können:
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;Berechtigungen
Erteilen Sie die Berechtigung für die View, nicht für die Basistabellen:
GRANT SELECT, UPDATE ON active_users TO app_user;Hinweis zur Performance
Ein INSTEAD OF-Trigger wird pro Zeile ausgelöst. Bei umfangreichen DML-Vorgängen ist das langsam. Häufig ist es besser, wenn Aufrufer direkt in die Basistabellen schreiben.
Rückblick
Views können beschreibbar sein.
- Einfache Views: automatisch aktualisierbar
- Komplexe Views: INSTEAD OF-Trigger
- WITH CHECK OPTION erzwingt die Sichtbarkeit
- RLS ist oft ein klareres Sicherheitsmodell
Kurzer Test
Sie definieren eine View, die zwei Tabellen verbindet. Können Sie standardmäßig über diese View UPDATE ausführen?
Lerne SQL mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 46
- Lektionen
- 183
Häufig gestellte Fragen
Ist die Lektion „Aktualisierbare Views und INSTEAD-OF-Trigger“ kostenlos?
Ja — der vollständige Text von „Aktualisierbare Views und INSTEAD-OF-Trigger“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Aktualisierbare Views und INSTEAD-OF-Trigger“?
Machen Sie Views direkt aktualisierbar oder verwenden Sie INSTEAD-OF-Trigger, wenn die View Daten aggregiert oder verknüpft. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Aktualisierbare Views und INSTEAD-OF-Trigger“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Einfache Views: Logische Wiederverwendung
- Aktualisierbare Views und INSTEAD-OF-Trigger
- Materialisierte Views und REFRESH-Strategien
- Wann Sie voraggregieren sollten