1.111. unsubscribeset( integer, integer )

関数特性

言語: PLPGSQL

戻り値: bigint

unsubscribeSet (sub_set, sub_receiver) 購読セット set sub_set からノード sub_receiver を非購読にします。これはレシーバノードで起動されます。これが如何なる変更にも違反しないと実証されれば(例えば、他のノードに対して sub_receiver がプロバイダであること)、Slony 特有のキーを削除し、そのセットに対するテーブルエントリを削除し、購読を削除し、そしてそのノードが削除された事を発行する UNSUBSCRIBE_SET 事象を生成します。

declare
	p_sub_set			alias for $1;
	p_sub_receiver			alias for $2;
	v_tab_row			record;
begin
	-- ----
	-- Grab the central configuration lock
	-- ----
	lock table sl_config_lock;

	-- ----
	-- レシーバノードでこれが呼ばれる事の検査
	-- ----
	if p_sub_receiver != getLocalNodeId('_schemadoc') then
		raise exception 'Slony-I: unsubscribeSet() must be called on receiver';
	end if;

	-- ----
	-- これが如何なる連鎖にも違反しない事の検査
	-- ----
	if exists (select true from sl_subscribe
			where sub_set = p_sub_set
				and sub_provider = p_sub_receiver)
	then
		raise exception 'Slony-I: Cannot unsubscibe set % while being provider',
				p_sub_set;
	end if;

	-- ----
	-- 全てのテーブルの元のトリガーとルールをリストアし
	-- 複製の諸々を削除
	-- ----
	for v_tab_row in select tab_id from sl_table
			where tab_set = p_sub_set
			order by tab_id
	loop
		perform alterTableRestore(v_tab_row.tab_id);
		perform tableDropKey(v_tab_row.tab_id);
	end loop;

	-- ----
	-- setsync ステータスの削除。これは同時に
	-- 作業者スレッド(worker thread)がセットを無視し複製をすぐに
	-- 中止する事になります。
	-- ----
	delete from sl_setsync
			where ssy_setid = p_sub_set;

	-- ----
	-- このセットに対する全ての sl_table と sl_sequence のエントリを削除
	-- 再度購読を開始するとすれば、初期データ複写過程で
	-- 新規に作成します。
	-- ----
	delete from sl_table
			where tab_set = p_sub_set;
	delete from sl_sequence
			where seq_set = p_sub_set;

	-- ----
	-- 購読削除のための内部プロシージャの呼び出し
	-- ----
	perform unsubscribeSet_int(p_sub_set, p_sub_receiver);

	-- Rewrite sl_listen table
	perform RebuildListenEntries();

	-- ----
	--  UNSUBSCRIBE_SET 事象の作成
	-- ----
	return  createEvent('_schemadoc', 'UNSUBSCRIBE_SET', 
			p_sub_set, p_sub_receiver);
end;