Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Как отключить все ключи (FK, PK)?  [new]
Vlad_567
Member

Откуда:
Сообщений: 50
Добрый день.

Как отключить все ключи на таблицах (FK, PK), а после экспорта-импорта включить их?


Нужно это вот для чего:
Пользователь работает с программой которая использует базу Firebird. У меня есть эта-же программа с базой (только данные в ней старые). Структура моей базы поменяется (я её доработаю, добавлю таблички, индексы, ...). А теперь пользователь должен из своей базы перегрузить свои данные в мою базу (перегрузку должна делать программа). Структура таблиц на 99% остаётся старой, т.е. добавится две-три новых таблички, или какая-то табличка разобъётся на две (часть полей останется в одной, часть в другой).
Таблиц в базе будет около 100-150, данных в табличках - не много, приблизительно до 10000-20000 записей.

Я хотел сделать так:
1. подключиться к своей базе, отключить все ключи (FK, PK)
2. удалить "почти" все (это и есть те одинаковые на 99% таблички для обоих баз) данные (удалить строки из таблиц).
3. в цикле пробежаться по "почти" всем табличкам и скопировать строки из базы пользователя в свою базу.
4. Оставшиеся данные (таблицы у которых поменялась структура) программа перенесёт по заложенному в неё алгоритму.
5. сделать на генераторах в своей базе - те-же значения, которые у пользователя, что-бы первичные ключи дальше генерировались правильно.
6. включить все ключи (FK, PK)

Пока при выключении FK индекса (ключ - это ссылка из таблички с данными, на табличку- справочник) столкнулся с ошибкой:
This operation is not defined for system tables.
unsuccessful metadata update.
ALTER INDEX @1 failed.
action cancelled by trigger (@1) to preserve data integrity.
Cannot deactivate index used by an integrity constraint.
8 сен 17, 03:07    [20780355]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57316
Vlad_567> Как отключить все ключи на таблицах (FK, PK),
Vlad_567> а после экспорта-импорта включить их?

Никак. Ни PK/FK, ни их индексы нельзя отключить.

> Нужно это вот для чего:
> А теперь пользователь должен из своей базы перегрузить
> свои данные в мою базу (перегрузку должна делать программа)

А почему программа и для чего это всё?
Почему нельзя просто скопировать его БД
(файл или бэкап) и просто все необходимые
изменения сделать над копией?

Posted via ActualForum NNTP Server 1.5

8 сен 17, 06:55    [20780401]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 250
Vlad_567,

Не отключить/включить, а удалить/создать. Другого пути, похоже, нет.
8 сен 17, 10:23    [20780967]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57316
Другой путь очень даже может существовать, если задачу хорошенько обдумать.

Posted via ActualForum NNTP Server 1.5

8 сен 17, 10:29    [20780993]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Ivan_Pisarevsky
Member

Откуда: НН
Сообщений: 7684
Похоже автору нужен репликатор.
8 сен 17, 11:47    [20781320]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57316
Репликатор со структурой БД не поможет.

Posted via ActualForum NNTP Server 1.5

8 сен 17, 11:58    [20781353]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57316
Да и операция у него, чую, разовая, а не регулярная.

Posted via ActualForum NNTP Server 1.5

8 сен 17, 11:58    [20781355]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 26556
Гаджимурадов Рустам
Никак. Ни PK/FK, ни их индексы нельзя отключить.

отключить-то можно, но в ФБ3 этот способ скорее всего работать не будет, хотя не проверял.
Собственно, сама идея отключить ПК и ФК, видимо, появилась из-за того, что автор не хочет выстраивать последовательность переноса данных. Понятно что без индексов заливка будет быстрее, но вряд-ли для автора сейчас это важный момент.

Vlad_567
2. удалить "почти" все (это и есть те одинаковые на 99% таблички для обоих баз) данные (удалить строки из таблиц).

нафиг это надо делать, если вы можете своей базе сделать gbak -b -g -m, и получить пустой бэкап, а затем его отресторить. Будет пустая база, гораздо быстрее чем удалять записи.
Другой вариант - создать пустую базу из скрипта вашей (isql -x).
В общем, явно не хватает знаний об инструментарии.
8 сен 17, 12:23    [20781440]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57316
kdv> отключить-то можно

Это хак. Да и разницы с удалением не будет.

Posted via ActualForum NNTP Server 1.5

8 сен 17, 12:44    [20781516]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 206
Гаджимурадов Рустам
Другой путь очень даже может существовать, если задачу хорошенько обдумать.


Вот это надо высечь в камне.
8 сен 17, 21:21    [20783032]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 206
kdv
Другой вариант - создать пустую базу из скрипта вашей (isql -x).


Даже более того - сначала только той части скрипта, в которой create table, без констрайнтов и индексов. Потом заливка данных, потом оставшуюся часть скрипта. Правда, чует моя печень, потом будем объяснять почему не создаются FK :)
8 сен 17, 21:27    [20783037]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57316
СПМ> Вот это надо высечь в камне.

Отлить в граните! (с)

Posted via ActualForum NNTP Server 1.5

9 сен 17, 00:40    [20783298]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Vlad_567
Member

Откуда:
Сообщений: 50
Вопрос решил.
Сделал так:
В программе пользователь указывает файлы БД старый и новый. В новой базе удаляю все ключи (FK, UN). Из старой базы все записи копируются в новую базу, а потом все ключи восстанавливаются (создаются заново).

Нужно это было вот для чего: Пользователь работает со своей базой, через какое-то время я скидываю ему новую базу, пустую, в которой появились новые таблицы, индексы. Программа все данные переносит в новую базу и пользователь работает уже с новой базой и текущими данными (это будет после доработки программы). Если изменится структура - программа при переносе данных это уже учтёт. Сделать экспорт/импорт сам я не могу, т.к. к пользователю подключиться не могу, всё общение через третьих лиц, а доработки будут еще делаться.
27 сен 17, 13:26    [20826563]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43647

Vlad_567
Пользователь работает со своей базой, через какое-то время я скидываю ему новую базу,
пустую, в которой появились новые таблицы, индексы.

А не проще ему скинуть скрипт создания новых таблиц и индексов в старой базе? Он будет
работать быстрее, чем переливка данных.

Posted via ActualForum NNTP Server 1.5

27 сен 17, 13:42    [20826596]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
Василий №2
Guest
+ за тулзу обновления. Сам так делаю.
27 сен 17, 14:14    [20826713]     Ответить | Цитировать Сообщить модератору
 Re: Как отключить все ключи (FK, PK)?  [new]
o_v_a
Member

Откуда: Тула
Сообщений: 902
Аналогично на сотнях инсталляций нашей системы.
Эталонные метаданные вместе с новыми программами, генерация и выполнение на боевой базе разностного скрипта и замена программ.
28 сен 17, 15:05    [20829181]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить