2009-12-04 4 views
0

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

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

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

ответ

3

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

  1. отложит ограничение
  2. Изменить родительское значение
  3. Изменят ребенок значения
  4. Зафиксируйте изменение

просто.

0

К сожалению. Небольшой поиск в Google заставляет казаться, что, необъяснимо, Oracle не реализует ON UPDATE CASCADE, только ON DELETE CASCADE. Чтобы найти обходные пути google ORACLE ON UPDATE CASCADE. Вот ссылка на Creating A Cascade Update Set of Tables в Oracle.

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

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

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

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

+0

IME, мы отключили бы противопоказания и обновили таблицу по таблицам. Tedious ... –

+0

Исходя из вопроса, я предполагаю, что они не в состоянии отключить ограничения, и похоже, что конечный пользователь хочет эту возможность на постоянной основе, а не как одноразовую работу. Я не вижу ничего другого, кроме написания довольно уродливого триггера при обновлении таблицы PK. –

+0

@Larry: Да, это значения, которые нужно изменить. @OMG: Да, очень утомительно :-(У вас есть интересный способ сделать это? :-) –

0

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

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

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

Смежные вопросы