1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
/*
* Snapshot destroyer function.
*/
CREATE FUNCTION snapshot_destroyer(p_dest_table text, p_keep_table boolean DEFAULT true, p_debug boolean DEFAULT false) RETURNS void
LANGUAGE plpgsql
AS $$
DECLARE
v_dest_schema_name text;
v_dest_table text;
v_dest_table_name text;
v_drop_table text;
v_drop_view text;
v_exists int;
v_rename_table text;
v_snap_suffix text;
v_src_table text;
v_table_name text;
v_view_definition text;
BEGIN
SELECT source_table, dest_table INTO v_src_table, v_dest_table
FROM @extschema@.refresh_config_snap WHERE dest_table = p_dest_table;
IF NOT FOUND THEN
RAISE EXCEPTION 'This table is not set up for snapshot replication: %', v_dest_table;
END IF;
SELECT schemaname, viewname
INTO v_dest_schema_name, v_dest_table_name
FROM pg_catalog.pg_views
WHERE schemaname||'.'||viewname = v_dest_table;
-- Keep one of the snap tables as a real table with the original view name
IF p_keep_table THEN
SELECT definition INTO v_view_definition FROM pg_views WHERE schemaname = v_dest_schema_name AND viewname = v_dest_table_name;
IF v_view_definition IS NULL THEN
RAISE EXCEPTION 'Destination table view not found: %', v_dest_table;
END IF;
v_exists := strpos(v_view_definition, 'snap1');
IF v_exists > 0 THEN
v_snap_suffix := '_snap1';
ELSE
v_snap_suffix := '_snap2';
END IF;
v_drop_view := format('DROP VIEW %I.%I', v_dest_schema_name, v_dest_table_name);
PERFORM @extschema@.gdb(p_debug, 'v_drop_view '||v_drop_view);
EXECUTE v_drop_view;
v_rename_table := format('ALTER TABLE %I.%I RENAME TO %I', v_dest_schema_name, v_dest_table_name||v_snap_suffix, v_dest_table_name);
PERFORM @extschema@.gdb(p_debug, 'v_rename_table '||v_rename_table);
EXECUTE v_rename_table;
RAISE NOTICE 'Destination table NOT destroyed: %. Changed from a view into a plain table', v_dest_table;
ELSE
v_drop_view := format('DROP VIEW %I.%I', v_dest_schema_name, v_dest_table_name);
PERFORM @extschema@.gdb(p_debug, 'v_drop_view '||v_drop_view);
EXECUTE v_drop_view;
RAISE NOTICE 'Destination table destroyed: %', v_dest_table;
END IF;
v_drop_table := format('DROP TABLE IF EXISTS %I.%I', v_dest_schema_name, v_dest_table_name||'_snap1');
PERFORM @extschema@.gdb(p_debug, 'v_drop_table '||v_drop_table);
EXECUTE v_drop_table;
v_drop_table := format('DROP TABLE IF EXISTS %I.%I', v_dest_schema_name, v_dest_table_name||'_snap2');
PERFORM @extschema@.gdb(p_debug, 'v_drop_table '||v_drop_table);
EXECUTE v_drop_table;
EXECUTE 'DELETE FROM @extschema@.refresh_config_snap WHERE dest_table = ' || quote_literal(v_dest_table);
END
$$;
|