1.44.  determineattkindserial( text )

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

Une table indiquée sans clé primaire est ajoutée à la réplication. Suppose que tableAddKey() a été appelé avant et termine la création de la colonne de type serial. Elle renvoie l'attkind.

declare
        p_tab_fqname    alias for $1;
        v_tab_fqname_quoted     text default '';
        v_attkind               text default '';
        v_attrow                record;
        v_have_serial   bool default 'f';
begin
        v_tab_fqname_quoted := slon_quote_input(p_tab_fqname);
        --
        -- Loop over the attributes of this relation
        -- and add a "v" for every user column, and a "k"
        -- if we find the Slony-I special serial column.
        --
        for v_attrow in select PGA.attnum, PGA.attname
                        from "pg_catalog".pg_class PGC,
                            "pg_catalog".pg_namespace PGN,
                                "pg_catalog".pg_attribute PGA
                        where slon_quote_brute(PGN.nspname) || '.' ||
                            slon_quote_brute(PGC.relname) = v_tab_fqname_quoted
                                and PGN.oid = PGC.relnamespace
                                and PGA.attrelid = PGC.oid
                                and not PGA.attisdropped
                                and PGA.attnum > 0
                        order by attnum
        loop
                if v_attrow.attname = '_Slony-I_schemadoc_rowID' then
                    v_attkind := v_attkind || 'k';
                        v_have_serial := 't';
                else
                        v_attkind := v_attkind || 'v';
                end if;
        end loop;
        
        --
        -- A table must have at least one attribute, so not finding
        -- anything means the table does not exist.
        --
        if not found then
                raise exception 'Slony-I: table % not found', v_tab_fqname_quoted;
        end if;

        --
        -- If it does not have the special serial column, we
        -- should not have been called in the first place.
        --
        if not v_have_serial then
                raise exception 'Slony-I: table % does not have the serial key',
                                v_tab_fqname_quoted;
        end if;

        execute 'update ' || v_tab_fqname_quoted ||
                ' set "_Slony-I_schemadoc_rowID" =' ||
                ' "pg_catalog".nextval(''sl_rowid_seq'');';
        execute 'alter table only ' || v_tab_fqname_quoted ||
                ' add unique ("_Slony-I_schemadoc_rowID");';
        execute 'alter table only ' || v_tab_fqname_quoted ||
                ' alter column "_Slony-I_schemadoc_rowID" ' ||
                ' set not null;';

        --
        -- Return the resulting Slony-I attkind
        --
        return v_attkind;
end;