Database Reference
In-Depth Information
Nun müssen wir noch ein Array mit Farbangaben zum gewünschten Feiertag
hinzufügen. Leider können wir einen View nicht direkt aktualisieren.
UPDATE
holidays
SET
colors =
'{"red","green"}'
where
name =
'Christmas Day'
;
ERROR: cannot update a view
HINT:
You need an unconditional ON UPDATE DO INSTEAD rule.
Sie so aus, als würden wir eine Regel (
RULE
) benötigen.
Regeln (RULEs)
Eine Regel (
RULE
) beschreibt, wie der geparste
Query-Baum
modifiziert wer-
den soll. Jedes Mal, wenn Postgres eine SQL-Anweisung ausführt, wandelt
es diese Anweisung zuerst in einen Query-Baum (allgemein auch
abstrakter
Syntax-Baum
genannt) um. Dieser Prozess wird als Parsing bezeichnet.
Operatoren und Werte werden in diesem Baum zu Zweigen und Blättern,
und vor der Ausführung wird er durchgegangen und beschnitten und auf
andere Weise bearbeitet. Dieser Baum kann optional über Postgres-Regeln
ungeschrieben werden, bevor er an den Query-Planer weitergegeben wird (der
den Baum so umschreibt, dass er optional ausgeführt wird), und er leitet
diesen letzten Befehl dann zur Ausführung weiter. Siehe Abbildung 5,
Wie
SQL bei PostgreSQL ausgeführt wird
, auf Seite 36. Mehr noch, ein
VIEW
wie
holidays
ist
eine Regel.
Wir können das nachweisen, indem wir uns den Ausführungsplan des
holi-
days
-Views mit dem
EXPLAIN
-Befehl ansehen (
Filter
ist die
WHERE
-Klausen und
Output
die Spaltenliste).
EXPLAIN VERBOSE
SELECT
*
FROM
holidays;
QUERY PLAN
-----------------------------------------------------------------------------------
Seq Scan on public.events (cost=0.00..1.04 rows=1 width=57)
Output: events.event
_
id, events.title, events.starts, events.colors
Filter: ((events.venue
_
id IS NULL) AND ((events.title)::text ~~ '%Day%'::text))
Vergleichen Sie das über
EXPLAIN VERBOSE
mit der Query, die wir für unseren
holidays
-
VIEW
nutzen. Sie sind funktional identisch.
EXPLAIN VERBOSE
SELECT
event
_
id
AS
holiday
_
id,
title
AS
name, starts
AS date
, colors
FROM
events
WHERE
title
LIKE
'%Day%'
AND
venue
_
id IS NULL;