関数特性
言語: PLPGSQL
戻り値: text
tableAddKey (tab_fqname) - もしテーブルがフォーム _Slony-I_<clustername>_rowID の列を未取得であれば、bigint で追加し、そのクラスタに対し作成されたシーケンスに対する nextval() をデフォルトとします。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); -- -- このリレーションの属性をループし、そして全てのユーザ列に -- "v" を追加し、もし Slony-I の特別の列を見出せば -- "k" を追加します。 -- 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; -- -- テーブルは少なくとも 1 つの属性を所有しなければならず、 -- 何も見つからない場合はテーブルが存在しない事を意味します。 -- if not found then raise exception 'Slony-I: table % not found', v_tab_fqname_quoted; end if; -- -- もし特別のシリアル列を所有しない場合、追加されなければなりません。 -- これでも半分の過程が終了したに過ぎません。 -- 全ての既存の行を更新した後 NOT NULL および UNIQUE を伴ったこれらの定義を -- テーブルをセットに追加する関数は完了させなければ -- なりません。 -- if not v_have_serial then execute 'lock table ' || v_tab_fqname_quoted || ' in access exclusive mode'; execute 'alter table only ' || v_tab_fqname_quoted || ' add column "_Slony-I_schemadoc_rowID" bigint;'; execute 'alter table only ' || v_tab_fqname_quoted || ' alter column "_Slony-I_schemadoc_rowID" ' || ' set default "pg_catalog".nextval(''sl_rowid_seq'');'; v_attkind := v_attkind || 'k'; end if; -- -- 結果の Slony-I attkind を戻します。 -- return v_attkind; end;