1.23.  altertablerestore( integer )

Propriétés de la fonction
Langage: PLPGSQL
Type du code retour: integer

Restaure la table d'identifiant table tab_id. Autrement dit, l'enlève de la réplication. Sur l'origine, ceci implique la suppression du trigger "logtrigger". Sur les nœuds abonnés, ceci implique la suppression du trigger "denyaccess", et restaure les triggers et règles utilisateurs.

declare
        p_tab_id                        alias for $1;
        v_no_id                         int4;
        v_tab_row                       record;
        v_tab_fqname            text;
        v_n                                     int4;
begin
        -- ----
        -- Grab the central configuration lock
        -- ----
        lock table sl_config_lock;

        -- ----
        -- Get our local node ID
        -- ----
        v_no_id := getLocalNodeId('_schemadoc');

        -- ----
        -- Get the sl_table row and the current tables origin. Check
        -- that the table currently IS in altered state.
        -- ----
        select T.tab_reloid, T.tab_set, T.tab_altered,
                        S.set_origin, PGX.indexrelid,
                        slon_quote_brute(PGN.nspname) || '.' ||
                        slon_quote_brute(PGC.relname) as tab_fqname
                        into v_tab_row
                        from sl_table T, sl_set S,
                                "pg_catalog".pg_class PGC, "pg_catalog".pg_namespace PGN,
                                "pg_catalog".pg_index PGX, "pg_catalog".pg_class PGXC
                        where T.tab_id = p_tab_id
                                and T.tab_set = S.set_id
                                and T.tab_reloid = PGC.oid
                                and PGC.relnamespace = PGN.oid
                                and PGX.indrelid = T.tab_reloid
                                and PGX.indexrelid = PGXC.oid
                                and PGXC.relname = T.tab_idxname
                                for update;
        if not found then
                raise exception 'Slony-I: alterTableRestore(): Table with id % not found', p_tab_id;
        end if;
        v_tab_fqname = v_tab_row.tab_fqname;
        if not v_tab_row.tab_altered then
                raise exception 'Slony-I: alterTableRestore(): Table % is not in altered state',
                                v_tab_fqname;
        end if;

        execute 'lock table ' || v_tab_fqname || ' in access exclusive mode';

        -- ----
        -- Procedures are different on origin and subscriber
        -- ----
        if v_no_id = v_tab_row.set_origin then
                -- ----
                -- On the Origin we just drop the trigger we originally added
                -- ----
                execute 'drop trigger "_schemadoc_logtrigger_' || 
                                p_tab_id || '" on ' || v_tab_fqname;
        else
                -- ----
                -- On the subscriber drop the denyAccess trigger
                -- ----
                execute 'drop trigger "_schemadoc_denyaccess_' || 
                                p_tab_id || '" on ' || v_tab_fqname;
                                
                -- ----
                -- Restore all original triggers
                -- ----
                update "pg_catalog".pg_trigger
                                set tgrelid = v_tab_row.tab_reloid
                                where tgrelid = v_tab_row.indexrelid;
                get diagnostics v_n = row_count;
                if v_n > 0 then
                        update "pg_catalog".pg_class
                                        set reltriggers = reltriggers + v_n
                                        where oid = v_tab_row.tab_reloid;
                end if;

                -- ----
                -- Restore all original rewrite rules
                -- ----
                update "pg_catalog".pg_rewrite
                                set ev_class = v_tab_row.tab_reloid
                                where ev_class = v_tab_row.indexrelid;
                get diagnostics v_n = row_count;
                if v_n > 0 then
                        update "pg_catalog".pg_class
                                        set relhasrules = true
                                        where oid = v_tab_row.tab_reloid;
                end if;

        end if;

        -- ----
        -- Mark the table not altered in our configuration
        -- ----
        update sl_table
                        set tab_altered = false where tab_id = p_tab_id;

        return p_tab_id;
end;