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;