Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сопоставление "сломанных" счетчиков с текущим ID / 13 сообщений из 13, страница 1 из 1
04.03.2021, 17:44
    #40050796
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
за 10 лет впервые сломалась база: во время создания записи БД на машине упал экплорер и ОСь повисла насмерть, пришлось машину ресетнуть кнопкой.

При перезапуске базы оказалось, что слетели автоинкрементые счетики на некоторых таблицах. По мере появления ошибок на нарушение уникальности FK правлю счетчики руками. Но хотелось бы проверить все разом одним запросом. Если возможно, то как?

=================
Док.

Win7 Ultim x64/Deb 10 (MATE; gtk2) amd64/Darwin Cocoa:
FB 3.0.6.33328, Lazarus 2.1(r.63874); FPC 3.3.1 trunk
...
Рейтинг: 0 / 0
04.03.2021, 17:49
    #40050797
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
Док,

одним - никак. Можно было бы сделать процедуру, в которой наворотить execute statement, вот только зачем, если генераторов обычно меньше чем таблиц, и кроме этого, на 100% установить взаимосвязь генераторов и таблиц невозможно.
Бывают системы, где генераторы дёргаются исключительно из приложения. И что тогда?
Короче, такая процедура если и будет работать, то меньше чем на 50% баз.

p.s. 100% соответствие генератора и таблицы - это identity в ФБ 3.
...
Рейтинг: 0 / 0
04.03.2021, 18:02
    #40050811
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
прибавить каждому по мильярду и дело с концом.

У нас базе условились называть генераторы как ИМЯ_ТАБЛИЦЫ_ID_GEN и все ПК это поле ID, находим легко.
...
Рейтинг: 0 / 0
04.03.2021, 18:16
    #40050817
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
Ivan_Pisarevsky
прибавить каждому по мильярду и дело с концом.

У нас базе условились называть генераторы как ИМЯ_ТАБЛИЦЫ_ID_GEN и все ПК это поле ID, находим легко.


у нас скрипт создания бд препроцессится и создает генераторы с именем таблицы.
и триггеры с if (NEW.ID is null) ...
...
Рейтинг: 0 / 0
04.03.2021, 18:22
    #40050822
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
kdv
p.s. 100% соответствие генератора и таблицы - это identity в ФБ 3.

ну, мне не надо 100% соответствия. Как и "бездырочной" нумерации :) В "сломанных" генераторах я просто ручками ставлю значение последнего ID соотвествующей таблицы и все.

Только делать это вручную для ВСЕХ генераторов лень, но придется, видимо
...
Рейтинг: 0 / 0
04.03.2021, 20:24
    #40050856
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
Докмне не надо 100% соответствия.
это не надо, при этом хотел "одним запросом". Сделай себе псевдо-системную таблицу в базе - таблица+имя_генератора. И пиши запрос на здоровье.
...
Рейтинг: 0 / 0
05.03.2021, 07:33
    #40050932
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
kdv
И пиши запрос на здоровье.

вот, блин, помощники Хотелось халявы...
...
Рейтинг: 0 / 0
05.03.2021, 07:35
    #40050933
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
"... человек, желающий трапезовать поздно вечером рискует трапезовать рано по утру" (ц) К. Прутков
...
Рейтинг: 0 / 0
05.03.2021, 08:18
    #40050940
ggreggory
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
Док
kdv
И пиши запрос на здоровье.

вот, блин, помощники Хотелось халявы...


Задача не универсальная, много нюансов может быть.

Вот заготовка, может поможет чем:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
create or alter procedure REFRESH_GENERATORS
returns (
    MSG varchar(255))
as
declare variable BIGTMP bigint;
declare variable TMP integer;
declare variable SOURCE varchar(31);
declare variable GENERATOR_NAME varchar(31);
declare variable KODS varchar(4096) = '';
begin
  for select j.rdb$relation_name, trim(g.rdb$generator_name) from rdb$relations j join rdb$generators g on
    'GEN_' || trim(j.rdb$relation_name) || '_ID' = g.rdb$generator_name
    where j.rdb$system_flag = 0
    into :source, :generator_name do
  begin
    kods = <<получение ключа>>(:source);
    tmp = null;
    execute statement 'select max(' || kods || '), gen_id(' || generator_name || ', 0) from ' || source || ' where ' || kods || '<2147483647' into :tmp, :bigtmp;
    if (tmp is null) then tmp = 0;
    if (tmp <> bigtmp) then
    begin
      execute statement 'select gen_id(' || generator_name || ', ' || tmp || '- gen_id(' || generator_name || ', 0)) from rdb$database' into :bigtmp;
      MSG = 'Изменен генератор для таблицы ' || source;
      suspend;
    end
  end

  if (msg is null) then
  begin
    MSG = 'Ok';
    suspend;
  end
end



Где <<получение ключа>> - процедура получения ключа. Оригинал содержит вызовы UDF, поэтому выложить не могу. Но смысл - получение первичного ключа или юника и если он не составной и целочисленный, то обновить генератор.
...
Рейтинг: 0 / 0
05.03.2021, 08:55
    #40050941
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
Док
Хотелось халявы...
Самый халявный вариант я уже предложил выше. :) Вполне, кстати, работоспособный, если ПК int64, то хоть каждый день двигай.
...
Рейтинг: 0 / 0
05.03.2021, 11:08
    #40051001
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
Ivan_Pisarevsky
Самый халявный вариант я уже предложил выше. :)

ну, это уже перебор :) Хотя, как вариант

ggreggory
Вот заготовка, может поможет чем

Спасибо, гляну
...
Рейтинг: 0 / 0
14.04.2021, 23:11
    #40062603
barry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
Док,
В DBComparer есть "Update Generator Values". Сопоставляет с Max(ID) соотв. таблиц. Если имена генераторов по маске...
...
Рейтинг: 0 / 0
16.04.2021, 07:27
    #40062941
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сопоставление "сломанных" счетчиков с текущим ID
Всем спасибо. Поправил все ручками, благо таблиц не очень много
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сопоставление "сломанных" счетчиков с текущим ID / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]