関数特性
言語: 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;