The document discusses view triggers in PostgreSQL. It describes how view triggers were implemented previously using rules and shadow tables, which had performance and concurrency issues. It then explains that view triggers are now implemented directly using trigger functions and triggers, avoiding the problems of the previous approach. This provides an easier way to execute code in response to INSERT, UPDATE, and DELETE operations on a view.
21. INSERT RULE
CREATE RULE t_v_insert
ON INSERT TO t_v
DO INSTEAD
INSERT INTO t_v_shadow (
action,
new_column,
new_list,
new_here)
VALUES (
'I',
NEW.t_v_column,
NEW.list,
NEW.here
);
22. DELETE RULE
CREATE RULE t_v_delete
ON DELETE TO t_v
DO INSTEAD
INSERT INTO t_v_shadow (
action,
column,
list,
here)
VALUES (
'D',
OLD.t_v_column,
OLD.list,
OLD.here
);
23. UPDATE RULE
CREATE RULE t_v_update
ON UPDATE TO t_v
DO INSTEAD
INSERT INTO t_v_shadow (
action,
column,
list,
here)
VALUES (
'U',
OLD.t_v_column,
OLD.list,
OLD.here,
NEW.t_v_column,
NEW.list,
NEW.here
);
24. Shadow Table Trigger Function
CREATE OR REPLACE FUNCTION shadow_table_t_v()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
IF NEW.action = 'I' THEN
...
ELSIF NEW.action = 'D' THEN
...
ELSIF NEW.action = 'U' THEN
...
END IF;
RETURN NULL;
END;
$$;
25. Shadow Trigger
CREATE TRIGGER shadow_table_t_v
BEFORE
INSERT OR UPDATE OR DELETE
ON shadow_t_v
FOR EACH ROW
EXECUTE PROCEDURE shadow_trigger_t_v();
38. Trigger Function
CREATE OR REPLACE FUNCTION write_triangle_victims_v()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
DECLARE
name_split TEXT[];
BEGIN
IF TG_OP = 'INSERT' THEN
name_split = string_to_array(NEW.full_name, ' ');
INSERT INTO triangle_victims (first_name, last_name, age, notes)
VALUES (
array_to_string(
name_split[1:array_upper(name_split,1)-1], ' '
),
name_split[array_upper(name_split,1)],
NEW.age,
NEW.notes
);
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN /* Similar code goes here */
ELSIF TG_OP = 'UPDATE' THEN /* And slightly more complicated here */
END IF;
END;
$$;