Как переименовать значения первичного ключа в Oracle? - PullRequest
0 голосов
/ 04 декабря 2009

Наше приложение использует базу данных Oracle 10g, где несколько первичных ключей предоставляются конечному пользователю. Коды продуктов и тому подобное. К сожалению, уже поздно что-либо делать с этим, поскольку существует множество отчетов и пользовательских сценариев, которые мы не можем контролировать. Мы не можем переопределить первичные ключи или испортить структуру базы данных.

Теперь некоторые клиенты хотят изменить некоторые значения первичного ключа. То, что они первоначально хотели назвать P23A1, теперь должно называться CAT23MOD1 (не реальный пример, но вы понимаете, о чем я.)

Есть ли простой способ сделать это? Я бы предпочел какой-то сценарий, который можно параметризовать, чтобы он соответствовал другим таблицам и ключам, но внешние инструменты были бы приемлемы, если бы не было другого способа.

Ответы [ 3 ]

3 голосов
/ 05 декабря 2009

Проблема, вероятно, связана с внешними ключами, которые ссылаются на PK.Вы должны определить внешние ключи как «первичные отсроченные немедленно», как описано в этой статье Тома Кайта: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html Это позволяет вам ...

  1. Отложить ограничения
  2. Изменить родительское значение
  3. Изменить дочерние значения
  4. Подтвердить изменение

Простой.

0 голосов
/ 04 декабря 2009

Если вам нужно сделать это в действующей системе без каких-либо изменений DDL для задействованных таблиц, то я думаю, что ваш единственный вариант - это (для каждого значения PK, которое необходимо изменить):

  1. Вставить в родительскую таблицу копию строки с замененным значением PK
  2. Для каждой дочерней таблицы обновите значение FK до нового значения PK
  3. Удалить строку родительской таблицы со старым значением PK

Если у вас есть список родительских таблиц и значения PK, которые необходимо переименовать, не составит труда написать процедуру, которая делает это - информацию в USER_CONSTRAINTS можно использовать для получения таблиц, связанных с FK, для заданная родительская таблица.

0 голосов
/ 04 декабря 2009

К сожалению. Небольшое прибегание к гулу дает понять, что, по необъяснимым причинам, Oracle не реализует ON UPDATE CASCADE, только ON DELETE CASCADE. Чтобы найти обходные пути, Google ORACLE ON UPDATE CASCADE Вот ссылка на Создание каскадного обновления таблиц в Oracle.

Оригинальный ответ:

Если я правильно понимаю, вы хотите изменить значения данных в столбцах первичного ключа, а не фактические имена ограничений самих ключей.

Если это так, легче всего выполнить переопределение ВСЕХ внешних ключей, которые ссылаются на затронутое ограничение первичного ключа, как ON UPDATE CASCADE. Это означает, что при изменении значения первичного ключа механизм автоматически обновит все связанные значения в таблицах внешнего ключа.

Имейте в виду, что если это приведет ко многим изменениям, это может быть слишком дорого в производственной системе.

...