powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сопоставление "сломанных" счетчиков с текущим ID
13 сообщений из 13, страница 1 из 1
Сопоставление "сломанных" счетчиков с текущим ID
    #40050796
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
за 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
Сопоставление "сломанных" счетчиков с текущим ID
    #40050797
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

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

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

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

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


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

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

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

вот, блин, помощники Хотелось халявы...
...
Рейтинг: 0 / 0
Сопоставление "сломанных" счетчиков с текущим ID
    #40050933
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"... человек, желающий трапезовать поздно вечером рискует трапезовать рано по утру" (ц) К. Прутков
...
Рейтинг: 0 / 0
Сопоставление "сломанных" счетчиков с текущим ID
    #40050940
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док
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
Сопоставление "сломанных" счетчиков с текущим ID
    #40050941
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Хотелось халявы...
Самый халявный вариант я уже предложил выше. :) Вполне, кстати, работоспособный, если ПК int64, то хоть каждый день двигай.
...
Рейтинг: 0 / 0
Сопоставление "сломанных" счетчиков с текущим ID
    #40051001
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky
Самый халявный вариант я уже предложил выше. :)

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

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

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


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