RUID

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Удаление из GD_RUID записей для несуществующих объектов)
Строка 67: Строка 67:
 
1) Создадим в таблице GD_RUID временное поле FLAG:
 
1) Создадим в таблице GD_RUID временное поле FLAG:
  
  ALTER TABLE gd_ruid ADD flag INTEGER
+
<syntaxhighlight lang="SQL">
 +
ALTER TABLE gd_ruid ADD flag INTEGER
 +
</syntaxhighlight>
  
 
2) Пробежимся по всем таблицам в базе данных и для существующих ИД пометим флагом соответствующие записи в GD_RUID:
 
2) Пробежимся по всем таблицам в базе данных и для существующих ИД пометим флагом соответствующие записи в GD_RUID:
Строка 101: Строка 103:
 
3) Удалим из GD_RUID записи, которые остались непомеченными:
 
3) Удалим из GD_RUID записи, которые остались непомеченными:
  
  DELETE FROM gd_ruid WHERE flag IS NULL
+
<syntaxhighlight lang="SQL">
 +
DELETE FROM gd_ruid WHERE flag IS NULL
 +
</syntaxhighlight>
  
 
4) Избавимся от временного поля FLAG:
 
4) Избавимся от временного поля FLAG:
  
  ALTER TABLE gd_ruid DROP flag
+
<syntaxhighlight lang="SQL">
 +
ALTER TABLE gd_ruid DROP flag
 +
</syntaxhighlight>
  
 
==== См. также ====
 
==== См. также ====

Версия 13:25, 13 апреля 2012

RUID (Record Unique Identifier) — уникальный идентификатор записи для всех существующих в природе баз данных системы Гедымин.

В пределах файла базы данных все объекты имеют уникальный целочисленный идентификатор благодаря использованию одного на все таблицы генератора gd_g_dbid. Каждая база данных имеет свой уникальный целочисленный идентификатор DBID, который хранится в генераторе gd_g_dbid. RUID объекта — это два целых числа:

  1. XID — идентификатор объекта на момент его создания.
  2. DBID — идентификатор базы данных, в которой этот объект был создан.

Строковое представление

В строковом представлении RUID имеет следующий вид: "xid_dbid". Обычно, РУИД в строковом представлении используется при вызове функции gdcBaseManager.GetIDByRUIDString. Например:

 gdcBaseManager.GetIDByRUIDString("147012468_486813904")

Хранение RUID в базе данных

Связи между идентификатором записи в текущей базе данных и ее РУИДом хранятся в таблице GD_RUID.

Присвоение RUID объекту

RUID присваивается объекту в следующих случаях:

Присвоить РУИДы всем записям в базе можно с помощью следующего запроса:

EXECUTE BLOCK
AS
  DECLARE VARIABLE RN VARCHAR(31);
  DECLARE VARIABLE EK INTEGER;
BEGIN
  SELECT FIRST 1 contactkey
  FROM gd_user u
  WHERE u.ibname = CURRENT_USER
  INTO :EK;
 
  FOR
    SELECT rf.rdb$relation_name
    FROM rdb$relation_fields rf JOIN rdb$fields f
      ON rf.rdb$field_source = f.rdb$field_name
    WHERE rf.rdb$field_name = 'ID' AND f.rdb$field_name = 'DINTKEY'
      /*
        укажите здесь условие, если в обработку необходимо
        включить только некоторые таблицы  
 
        AND rf.rdb$relation_name IN (...)
      */
    INTO :RN
  DO BEGIN
    EXECUTE STATEMENT
      'MERGE INTO gd_ruid r ' ||
      '  USING (SELECT id FROM ' || :RN || ' WHERE id >= 147000000) i ' ||
      '  ON (i.id = r.id) ' ||
      '  WHEN NOT MATCHED THEN ' ||
      '    INSERT (id, xid, dbid, modified, editorkey) ' ||
      '    VALUES (i.id, i.id, GEN_ID(gd_g_dbid, 0), CURRENT_TIMESTAMP, ' || :EK || ') ';
  END
END

Удаление из GD_RUID записей для несуществующих объектов

Данную задачу можно выполнить следующим образом:

1) Создадим в таблице GD_RUID временное поле FLAG:

ALTER TABLE gd_ruid ADD flag INTEGER

2) Пробежимся по всем таблицам в базе данных и для существующих ИД пометим флагом соответствующие записи в GD_RUID:

EXECUTE BLOCK
AS
  DECLARE VARIABLE RN VARCHAR(31);
BEGIN
  FOR
    SELECT rf.rdb$relation_name
    FROM rdb$relation_fields rf JOIN rdb$fields f
      ON rf.rdb$field_source = f.rdb$field_name
    WHERE rf.rdb$field_name = 'ID' AND f.rdb$field_name = 'DINTKEY'
      /*
        укажите здесь условие, если в обработку необходимо
        включить только некоторые таблицы  
 
        AND rf.rdb$relation_name IN (...)
      */
    INTO :RN
  DO BEGIN
    EXECUTE STATEMENT
      'MERGE INTO gd_ruid r ' ||
      '  USING (SELECT id FROM ' || :RN || ' WHERE id >= 147000000) i ' ||
      '  ON (i.id = r.id) ' ||
      '  WHEN MATCHED THEN ' ||
      '    UPDATE SET flag = 1 ';
  END
END

3) Удалим из GD_RUID записи, которые остались непомеченными:

DELETE FROM gd_ruid WHERE flag IS NULL

4) Избавимся от временного поля FLAG:

ALTER TABLE gd_ruid DROP flag

См. также

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты