Slony-I 2.1.4 Documentation | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 8. Schema schemadoc | Fast Forward | Next |
8.146. upgradeschema(p_old text)
Function Properties
Language: PLPGSQL
Return Type: text
Called during "update functions" by slonik to perform schema changesdeclare v_tab_row record; v_query text; v_keepstatus text; begin -- If old version is pre-2.0, then we require a special upgrade process if p_old like '1.%' then raise exception 'Upgrading to Slony-I 2.x requires running slony_upgrade_20'; end if; perform upgradeSchemaAddTruncateTriggers(); -- Change all Slony-I-defined columns that are "timestamp without time zone" to "timestamp *WITH* time zone" if exists (select 1 from information_schema.columns c where table_schema = '_schemadoc' and data_type = 'timestamp without time zone' and exists (select 1 from information_schema.tables t where t.table_schema = c.table_schema and t.table_name = c.table_name and t.table_type = 'BASE TABLE') and (c.table_name, c.column_name) in (('sl_confirm', 'con_timestamp'), ('sl_event', 'ev_timestamp'), ('sl_registry', 'reg_timestamp'),('sl_archive_counter', 'ac_timestamp'))) then -- Preserve sl_status select pg_get_viewdef('sl_status') into v_keepstatus; execute 'drop view sl_status'; for v_tab_row in select table_schema, table_name, column_name from information_schema.columns c where table_schema = '_schemadoc' and data_type = 'timestamp without time zone' and exists (select 1 from information_schema.tables t where t.table_schema = c.table_schema and t.table_name = c.table_name and t.table_type = 'BASE TABLE') and (table_name, column_name) in (('sl_confirm', 'con_timestamp'), ('sl_event', 'ev_timestamp'), ('sl_registry', 'reg_timestamp'),('sl_archive_counter', 'ac_timestamp')) loop raise notice 'Changing Slony-I column [%.%] to timestamp WITH time zone', v_tab_row.table_name, v_tab_row.column_name; v_query := 'alter table ' || slon_quote_brute(v_tab_row.table_schema) || '.' || v_tab_row.table_name || ' alter column ' || v_tab_row.column_name || ' type timestamp with time zone;'; execute v_query; end loop; -- restore sl_status execute 'create view sl_status as ' || v_keepstatus; end if; if not exists (select 1 from information_schema.tables where table_schema = '_schemadoc' and table_name = 'sl_components') then v_query := ' create table sl_components ( co_actor text not null primary key, co_pid integer not null, co_node integer not null, co_connection_pid integer not null, co_activity text, co_starttime timestamptz not null, co_event bigint, co_eventtype text ) without oids; '; execute v_query; end if; if not exists (select 1 from information_schema.tables t where table_schema = '_schemadoc' and table_name = 'sl_event_lock') then v_query := 'create table sl_event_lock (dummy integer);'; execute v_query; end if; return p_old; end;