1.101.  setdropsequence_int( integer )

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

Ceci traite l'événement SET_DROP_SEQUENCE. Sur les nœuds distants qui sont abonnés à l'ensemble contenant la séquence seq_id, supprime la séquence de l'ensemble de réplication.

declare
        p_seq_id                alias for $1;
        v_set_id                int4;
        v_local_node_id         int4;
        v_set_origin            int4;
        v_sub_provider          int4;
        v_relkind                       char;
        v_sync_row                      record;
begin
        -- ----
        -- Grab the central configuration lock
        -- ----
        lock table sl_config_lock;

        -- ----
        -- Determine set id for this sequence
        -- ----
        select seq_set into v_set_id from sl_sequence where seq_id = p_seq_id;

        -- ----
        -- Ensure sequence exists
        -- ----
        if not found then
                return 0;
        end if;

        -- ----
        -- For sets with a remote origin, check that we are subscribed 
        -- to that set. Otherwise we ignore the sequence because it might 
        -- not even exist in our database.
        -- ----
        v_local_node_id := getLocalNodeId('_schemadoc');
        select set_origin into v_set_origin
                        from sl_set
                        where set_id = v_set_id;
        if not found then
                raise exception 'Slony-I: setDropSequence_int(): set % not found',
                                v_set_id;
        end if;
        if v_set_origin != v_local_node_id then
                select sub_provider into v_sub_provider
                                from sl_subscribe
                                where sub_set = v_set_id
                                and sub_receiver = getLocalNodeId('_schemadoc');
                if not found then
                        return 0;
                end if;
        end if;

        -- ----
        -- drop the sequence from sl_sequence, sl_seqlog
        -- ----
        delete from sl_seqlog where seql_seqid = p_seq_id;
        delete from sl_sequence where seq_id = p_seq_id;

        return p_seq_id;
end;