Как известно, таблица SNP_EXP_TXT содержит текстовые части команд ODI.
В старых версиях, с 10.1.3.2.0 по 10.1.3.5.1 для ключевой колонки I_TXT из этой таблицы выделялось недостаточно места, таким образом, с течением времени могла возникнуть ситуация, когда свободные номера в колонке заканчивались, и она начинала выделять значения с 0, что приводило к ошибке ORA-00001: unique constraint (SDS1.PK_EXP_TXT) violated.
В версии 10.1.3.5.2 поле увеличили до 19 знаков.
Но, тем не менее, может возникнуть ситуация когда необходимо будет перестроить данную таблицу и убрать из нее дырки в нумерации ключей.
Один из наших коллег получил такой совет от техподдержки компании Оракл:
Как перенумеровать записи в таблице SNP_EXP_TXT рабочего репозитория ODI(Doc ID 753313.1).
Применимо к: Oracle Data Integrator - начиная с версии 10.1.3.2.0 [Релиз: 10gR3 и более поздние]
Информация в этом документе применима к системам на любых платформах.
Цель: данный документ предоставляет детальные SQL команды и пошаговые инструкции чтобы перенумеровать значения ключа в таблице SNP_EXP_TXT и связанных таблицах, а также чтобы переинициализоровать счетчик для ключа.
В А Ж Н О:
1. SQL команды, описанные ниже, не должны запускаться сами по себе, а обязательно должны удовлетворять требованиям описанным в документе Note 603109.1.
Я просмотрел этот документ, там рекомендуется очистить логи выполнения сессий в Операторе, удалить неиспользуемые записи в таблице SNP_EXP_TXT, а уже затем приступать к перенумерации записей.
Шаг 2. Установите соединение с базой данных и схемой, в которых содержатся данные рабочего репозитория. Включите режим работы с использованием транзакций и без автоматического закрепления транзакций.
Шаг 3. Подготовка к работе. Копирование существующего ключа таблицы SNP_EXP_TXT.I_TXT во временную таблицу.
Oracle:
/* Пересчет статистики и перераспределение занимаемого места */
analyze table SNP_EXP_TXT compute statistics;
alter table SNP_EXP_TXT enable row movement;
analyze table SNP_SESSION compute statistics;
alter table SNP_SESSION enable row movement;
analyze table SNP_STEP_LOG compute statistics;
alter table SNP_STEP_LOG enable row movement;
analyze table SNP_SESS_TASK_LOG compute statistics;
alter table SNP_SESS_TASK_LOG enable row movement;
analyze table SNP_SESS_TXT_LOG compute statistics;
alter table SNP_SESS_TXT_LOG enable row movement;
analyze table SNP_SESS_STEP compute statistics;
alter table SNP_SESS_STEP enable row movement;
analyze table SNP_SESS_TASK compute statistics;
alter table SNP_SESS_TASK enable row movement;
analyze table SNP_TASK_TXT compute statistics;
alter table SNP_TASK_TXT enable row movement;
analyze table SNP_VAR_SESS compute statistics;
alter table SNP_VAR_SESS enable row movement;
analyze table SNP_VAR_SCEN compute statistics;
alter table SNP_VAR_SCEN enable row movement;
analyze table SNP_STEP_REPORT compute statistics;
alter table SNP_STEP_REPORT enable row movement;
analyze table SNP_SCEN_REPORT compute statistics;
alter table SNP_SCEN_REPORT enable row movement;
/* ТОЛЬКО для Oracle 10g+ и при установленной, для табличных пространств, опции autoextend*/
alter table SNP_EXP_TXT shrink space cascade;
alter table SNP_SESSION shrink space cascade;
alter table SNP_STEP_LOG shrink space cascade;
alter table SNP_SESS_TASK_LOG shrink space cascade;
alter table SNP_SESS_TXT_LOG shrink space cascade;
alter table SNP_SESS_STEP shrink space cascade;
alter table SNP_SESS_TASK shrink space cascade;
alter table SNP_TASK_TXT shrink space cascade;
alter table SNP_VAR_SESS shrink space cascade;
alter table SNP_VAR_SCEN shrink space cascade;
alter table SNP_STEP_REPORT shrink space cascade;
alter table SNP_SCEN_REPORT shrink space cascade;
/* Создание и заполнение временной таблицы */
create table XXX_EXP_TXT
(
NEW_ID NUMBER (19),
I_TXT NUMBER (19) NOT NULL,
primary key (I_TXT)
)
insert into XXX_EXP_TXT
(
I_TXT
)
select distinct I_TXT
from SNP_EXP_TXT
analyze table XXX_EXP_TXT compute statistics
Microsoft SQLServer:
/* Создание и заполнение временной таблицы */
create table XXX_EXP_TXT
(
ID NUMERIC(19) IDENTITY,
NEW_ID NUMERIC(19) NOT NULL,
I_TXT NUMERIC(19) NOT NULL,
primary key (I_TXT, NEW_ID)
)
insert into XXX_EXP_TXT
(
I_TXT, NEW_ID
)
select distinct I_TXT, 0
from SNP_EXP_TXT
IBM DB2/400:
Сначала запустите RGZPFM для таблицы SNP_EXP_TXT, чтобы провести ее реорганизацию.
Затем:
create table XXX_EXP_TXT
(
NEW_ID NUMERIC (19) WITH DEFAULT,
I_TXT NUMERIC (19) NOT NULL WITH DEFAULT,
primary key (I_TXT)
)
insert into XXX_EXP_TXT
(
I_TXT
)
select distinct I_TXT
from SNP_EXP_TXT
IBM DB2 UDB:
create table XXX_EXP_TXT
(
NEW_ID NUMERIC (19) WITH DEFAULT,
I_TXT NUMERIC (19) NOT NULL WITH DEFAULT,
primary key (I_TXT)
)
insert into XXX_EXP_TXT
(
I_TXT
)
select distinct I_TXT
from SNP_EXP_TXT
Шаг 4. Реорганизация идентификаторов, используемых в таблице SNP_EXP_TXT.
Для строк во временной таблице XXX_EXP_TXT выполним перенумерацию, выделив новое значение идентификатора начинающееся с номера 1.
Oracle: (использование стандартной функции ROWNUM):
update XXX_EXP_TXT
set NEW_ID = rownum * 1000 + to_number(substr(to_char(I_TXT), length(to_char(I_TXT)) - 2, 3))
Microsoft SQLServer: (использование механизма IDENTITY колонок):
update X
set X.NEW_ID = X.ID * 1000 + substring(convert(varchar,I_TXT), len(convert(varchar,I_TXT)) - 2, 3)
from XXX_EXP_TXT X
IBM DB2/400: (решение с использованием функции Relative Record Number):
update XXX_EXP_TXT
set NEW_ID = rrn(XXX_EXP_TXT) * 1000 + bigint(substring(digits(I_TXT), length(digits(I_TXT)) - 2, 3))
IBM DB2 UDB: (использование последовательности БД):
create sequence XXX_EXP_TXT_SEQ
start with 1
update XXX_EXP_TXT
set NEW_ID = (next value for XXX_EXP_TXT_SEQ) * 1000 + integer(substr(digits(I_TXT), length(digits(I_TXT)) - 2, 3))
Шаг 5. Обновляем SNP_EXP_TXT и связанные таблицы.
Oracle: (часть 1. см. ниже часть 2):
create table YYY_EXP_TXT
as
select S.*
from SNP_EXP_TXT S
where 1=2
insert into YYY_EXP_TXT
(
FIRST_DATE,
FIRST_USER,
IND_CHANGE,
INT_VERSION,
I_TXT,
LAST_DATE,
LAST_USER,
TXT,
TXT_ORD
)
select
S.FIRST_DATE,
S.FIRST_USER,
S.IND_CHANGE,
S.INT_VERSION,
X.NEW_ID,
S.LAST_DATE,
S.LAST_USER,
S.TXT,
S.TXT_ORD
from SNP_EXP_TXT S,
XXX_EXP_TXT X
where X.I_TXT = S.I_TXT
truncate table SNP_EXP_TXT
insert into SNP_EXP_TXT
select * from YYY_EXP_TXT
drop table YYY_EXP_TXT
/* Сбор статистики и переразмещение таблиц */
analyze table SNP_EXP_TXT compute statistics;
alter table SNP_EXP_TXT enable row movement;
analyze table SNP_SESSION compute statistics;
alter table SNP_SESSION enable row movement;
analyze table SNP_STEP_LOG compute statistics;
alter table SNP_STEP_LOG enable row movement;
analyze table SNP_SESS_TASK_LOG compute statistics;
alter table SNP_SESS_TASK_LOG enable row movement;
analyze table SNP_SESS_TXT_LOG compute statistics;
alter table SNP_SESS_TXT_LOG enable row movement;
analyze table SNP_SESS_STEP compute statistics;
alter table SNP_SESS_STEP enable row movement;
analyze table SNP_SESS_TASK compute statistics;
alter table SNP_SESS_TASK enable row movement;
analyze table SNP_TASK_TXT compute statistics;
alter table SNP_TASK_TXT enable row movement;
analyze table SNP_VAR_SESS compute statistics;
alter table SNP_VAR_SESS enable row movement;
analyze table SNP_VAR_SCEN compute statistics;
alter table SNP_VAR_SCEN enable row movement;
analyze table SNP_STEP_REPORT compute statistics;
alter table SNP_STEP_REPORT enable row movement;
analyze table SNP_SCEN_REPORT compute statistics;
alter table SNP_SCEN_REPORT enable row movement;
/* ТОЛЬКО для Oracle 10g+ и при установленной, для табличных пространств, опции autoextend*/
alter table SNP_EXP_TXT shrink space cascade;
alter table SNP_SESSION shrink space cascade;
alter table SNP_STEP_LOG shrink space cascade;
alter table SNP_SESS_TASK_LOG shrink space cascade;
alter table SNP_SESS_TXT_LOG shrink space cascade;
alter table SNP_SESS_STEP shrink space cascade;
alter table SNP_SESS_TASK shrink space cascade;
alter table SNP_TASK_TXT shrink space cascade;
alter table SNP_VAR_SESS shrink space cascade;
alter table SNP_VAR_SCEN shrink space cascade;
alter table SNP_STEP_REPORT shrink space cascade;
alter table SNP_SCEN_REPORT shrink space cascade;
IBM DB2/400 и IBM DB2 UDB: (часть 1. см. ниже часть 2):
update SNP_EXP_TXT S
set S.I_TXT = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT = X.I_TXT
)
Часть 2 для Oracle:, IBM DB2/400 и IBM DB2 UDB::
/* SNP_SESS_TASK_LOG: Ошибки и предупреждения для задач сессий */
update SNP_SESS_TASK_LOG S
set S.I_TXT_TASK_MESS = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_TASK_MESS = X.I_TXT
)
where S.I_TXT_TASK_MESS is not null
and exists (select 'X'
from SNP_SESS_TASK_LOG S2
where S.I_TXT_TASK_MESS = S2.I_TXT_TASK_MESS
)
/* SNP_STEP_LOG: Ошибки и предупреждения для шагов сессий */
update SNP_STEP_LOG S
set S.I_TXT_STEP_MESS = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_STEP_MESS = X.I_TXT
)
where S.I_TXT_STEP_MESS is not null
and exists (select 'X'
from SNP_STEP_LOG S2
where S.I_TXT_STEP_MESS = S2.I_TXT_STEP_MESS
)
/* SNP_VAR_SESS (1): Значения переменных во время выполнения */
update SNP_VAR_SESS S
set S.I_TXT_VAR = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_VAR = X.I_TXT
)
where S.I_TXT_VAR is not null
and exists (select 'X'
from SNP_VAR_SESS S2
where S.I_TXT_VAR = S2.I_TXT_VAR
)
/* SNP_VAR_SESS (2): Значения переменных по-умолчанию во время выполнения */
update SNP_VAR_SESS S
set S.I_TXT_DEF_T = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_DEF_T = X.I_TXT
)
where S.I_TXT_DEF_T is not null
and exists (select 'X'
from SNP_VAR_SESS S2
where S.I_TXT_DEF_T = S2.I_TXT_DEF_T
)
/* SNP_SESSION (1): Параметры и ключевые слова для сессий */
update SNP_SESSION S
set S.I_TXT_SESS_PARAMS = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_SESS_PARAMS = X.I_TXT
)
where S.I_TXT_SESS_PARAMS is not null
and exists (select 'X'
from SNP_SESSION S2
where S.I_TXT_SESS_PARAMS = S2.I_TXT_SESS_PARAMS
)
/* SNP_SESSION (2): Ошибки и предупреждения для сессий */
update SNP_SESSION S
set S.I_TXT_SESS_MESS = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_SESS_MESS = X.I_TXT
)
where S.I_TXT_SESS_MESS is not null
and exists (select 'X'
from SNP_SESSION S2
where S.I_TXT_SESS_MESS = S2.I_TXT_SESS_MESS
)
/* SNP_STEP_REPORT: Ошибки и предупреждения для шагов сценариев */
update SNP_STEP_REPORT S
set S.I_TXT_STEP_MESS = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_STEP_MESS = X.I_TXT
)
where S.I_TXT_STEP_MESS is not null
and exists (select 'X'
from SNP_STEP_REPORT S2
where S.I_TXT_STEP_MESS = S2.I_TXT_STEP_MESS
)
/* SNP_SCEN_REPORT: Ошибки и предупреждения для сценариев */
update SNP_SCEN_REPORT S
set S.I_TXT_SESS_MESS = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_SESS_MESS = X.I_TXT
)
where S.I_TXT_SESS_MESS is not null
and exists (select 'X'
from SNP_SCEN_REPORT S2
where S.I_TXT_SESS_MESS = S2.I_TXT_SESS_MESS
)
... Данные сценариев:
/* SNP_SCEN : Описания сценариев */
update SNP_SCEN S
set S.I_TXT_SCEN = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_SCEN = X.I_TXT
)
where S.I_TXT_SCEN is not null
and exists (select 'X'
from SNP_SCEN S2
where S.I_TXT_SCEN = S2.I_TXT_SCEN
)
/* SNP_SCEN_FOLDER: Описание папок сценариев */
update SNP_SCEN_FOLDER S
set S.I_TXT_DESCRIPTION = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_DESCRIPTION = X.I_TXT
)
where S.I_TXT_DESCRIPTION is not null
and exists (select 'X'
from SNP_SCEN_FOLDER S2
where S.I_TXT_DESCRIPTION = S2.I_TXT_DESCRIPTION
)
... Данные сценариев и многострочных переменных:
/* SNP_VAR_SCEN (1): Значение переменных во время выполнения сценариев */
update SNP_VAR_SCEN S
set S.I_TXT_VAR = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_VAR = X.I_TXT
)
where S.I_TXT_VAR is not null
and exists (select 'X'
from SNP_VAR_SCEN S2
where S.I_TXT_VAR = S2.I_TXT_VAR
)
/* SNP_VAR_SCEN (2): Значения переменных по-умолчанию при выполнении сценариев */
update SNP_VAR_SCEN S
set S.I_TXT_DEF_T = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_DEF_T = X.I_TXT
)
where S.I_TXT_DEF_T is not null
and exists (select 'X'
from SNP_VAR_SCEN S2
where S.I_TXT_DEF_T = S2.I_TXT_DEF_T
)
/* SNP_VAR_DATA: Значения многострочных переменных */
update SNP_VAR_DATA S
set S.I_TXT_VAR_T = (select X.NEW_ID
from XXX_EXP_TXT X
where S.I_TXT_VAR_T = X.I_TXT
)
where S.I_TXT_VAR_T is not null
and exists (select 'X'
from SNP_VAR_DATA S2
where S.I_TXT_VAR_T = S2.I_TXT_VAR_T
)
Microsoft SQLServer::
select S.*
into YYY_EXP_TXT
from SNP_EXP_TXT S
where 1=2
insert into YYY_EXP_TXT
(
FIRST_DATE,
FIRST_USER,
IND_CHANGE,
INT_VERSION,
I_TXT,
LAST_DATE,
LAST_USER,
TXT,
TXT_ORD
)
select
S.FIRST_DATE,
S.FIRST_USER,
S.IND_CHANGE,
S.INT_VERSION,
X.NEW_ID,
S.LAST_DATE,
S.LAST_USER,
S.TXT,
S.TXT_ORD
from SNP_EXP_TXT S,
XXX_EXP_TXT X
where X.I_TXT = S.I_TXT
truncate table SNP_EXP_TXT
insert into SNP_EXP_TXT
select * from YYY_EXP_TXT
... данные о выполнениях:
/* SNP_SESS_TASK_LOG: Ошибки и предупреждения для задач сессий */
update S
set S.I_TXT_TASK_MESS = X.NEW_ID
from SNP_SESS_TASK_LOG S,
XXX_EXP_TXT X
where S.I_TXT_TASK_MESS = X.I_TXT
and S.I_TXT_TASK_MESS is not null
/* SNP_STEP_LOG: Ошибки и предупреждения для шагов сессий */
update S
set S.I_TXT_STEP_MESS = X.NEW_ID
from SNP_STEP_LOG S,
XXX_EXP_TXT X
where S.I_TXT_STEP_MESS = X.I_TXT
and S.I_TXT_STEP_MESS is not null
/* SNP_VAR_SESS (1): Значения переменных во время выполнения */
update S
set S.I_TXT_VAR = X.NEW_ID
from SNP_VAR_SESS S,
XXX_EXP_TXT X
where S.I_TXT_VAR = X.I_TXT
and S.I_TXT_VAR is not null
/* SNP_VAR_SESS (2): Значения переменных по-умолчанию во время выполнения */
update S
set S.I_TXT_DEF_T = X.NEW_ID
from SNP_VAR_SESS S,
XXX_EXP_TXT X
where S.I_TXT_DEF_T = X.I_TXT
and S.I_TXT_DEF_T is not null
/* SNP_SESSION (1): Параметры и ключевые слова для сессий */
update S
set S.I_TXT_SESS_PARAMS = X.NEW_ID
from SNP_SESSION S,
XXX_EXP_TXT X
where S.I_TXT_SESS_PARAMS = X.I_TXT
and S.I_TXT_SESS_PARAMS is not null
/* SNP_SESSION (2): Ошибки и предупреждения для сессий */
update S
set S.I_TXT_SESS_MESS = X.NEW_ID
from SNP_SESSION S,
XXX_EXP_TXT X
where S.I_TXT_SESS_MESS = X.I_TXT
and S.I_TXT_SESS_MESS is not null
/* SNP_STEP_REPORT: Ошибки и предупреждения для шагов сценариев */
update S
set S.I_TXT_STEP_MESS = X.NEW_ID
from SNP_STEP_REPORT S,
XXX_EXP_TXT X
where S.I_TXT_STEP_MESS = X.I_TXT
and S.I_TXT_STEP_MESS is not null
/* SNP_SCEN_REPORT: Ошибки и предупреждения для сценариев */
update S
set S.I_TXT_SESS_MESS = X.NEW_ID
from SNP_SCEN_REPORT S,
XXX_EXP_TXT X
where S.I_TXT_SESS_MESS = X.I_TXT
and S.I_TXT_SESS_MESS is not null
... данные сценариев:
/* SNP_SCEN : Описания сценариев */
update S
set S.I_TXT_SCEN = X.NEW_ID
from SNP_SCEN S,
XXX_EXP_TXT X
where S.I_TXT_SCEN = X.I_TXT
and S.I_TXT_SCEN is not null
/* SNP_SCEN_FOLDER: Описание папок сценариев */
update S
set S.I_TXT_DESCRIPTION = X.NEW_ID
from SNP_SCEN_FOLDER S,
XXX_EXP_TXT X
where S.I_TXT_DESCRIPTION = X.I_TXT
and S.I_TXT_DESCRIPTION is not null
... Данные сценариев и многострочных переменных:
/* SNP_VAR_SCEN (1): Значение переменных во время выполнения сценариев */
update S
set S.I_TXT_VAR = X.NEW_ID
from SNP_VAR_SCEN S,
XXX_EXP_TXT X
where S.I_TXT_VAR = X.I_TXT
and S.I_TXT_VAR is not null
/* SNP_VAR_SCEN (2): Значения переменных по-умолчанию во время выполнения */
update S
set S.I_TXT_DEF_T = X.NEW_ID
from SNP_VAR_SCEN S,
XXX_EXP_TXT X
where S.I_TXT_DEF_T = X.I_TXT
and S.I_TXT_DEF_T is not null
/* SNP_VAR_DATA: Значения многострочных переменных */
update S
set S.I_TXT_VAR_T = X.NEW_ID
from SNP_VAR_DATA S,
XXX_EXP_TXT X
where S.I_TXT_VAR_T = X.I_TXT
and S.I_TXT_VAR_T is not null
Шаг 6. Установим следующее доступное значение для новых идентификаторов таблицы SNP_EXP_TXT. Установим верное значение в таблице SNP_ID соответствующее увеличенному на единицу максимальному значению SNP_EXP_TXT.I_TXT:
Oracle, Microsoft SQLServer, IBM DB2/400 и IBM DB2 UDB:
update SNP_ID
set ID_NEXT = (select max(round(NEW_ID/1000,0)) + 1 from XXX_EXP_TXT)
where ID_TBL = 'SNP_EXP_TXT'
Шаг 7.. Применяем изменения и закрепляем транзакцию.
commit
Шаг 8. Удаляем временные объекты БД.
Oracle: и IBM DB2/400
drop table XXX_EXP_TXT
Microsoft SQLServer:
drop table XXX_EXP_TXT
drop table YYY_EXP_TXT
drop table XXX_EXP_TXT
drop table YYY_EXP_TXT /* if step 6ii has been applied */
drop sequence XXX_EXP_TXT_SEQ
Источник:
http://forums.oracle.com/forums/thread.jspa?threadID=1072642
См. также удаление неиспользованной информации из СНП_ТЕКСТ.
Типы переменных.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.