RUID
SYSDBA (обсуждение | вклад) (→См. также) |
SYSDBA (обсуждение | вклад) (→См. также) |
||
| Строка 60: | Строка 60: | ||
END | END | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | |||
| + | ==== Удаление из GD_RUID записей для несуществующих объектов ==== | ||
| + | |||
| + | Данную задачу можно выполнить следующим образом: | ||
| + | |||
| + | 1) Создадим в таблице GD_RUID временное поле FLAG: | ||
| + | |||
| + | ALTER TABLE gd_ruid ADD flag INTEGER | ||
| + | |||
| + | 2) | ||
==== См. также ==== | ==== См. также ==== | ||
Версия 13:16, 13 апреля 2012
RUID (Record Unique Identifier) — уникальный идентификатор записи для всех существующих в природе баз данных системы Гедымин.
В пределах файла базы данных все объекты имеют уникальный целочисленный идентификатор благодаря использованию одного на все таблицы генератора gd_g_dbid. Каждая база данных имеет свой уникальный целочисленный идентификатор DBID, который хранится в генераторе gd_g_dbid. RUID объекта — это два целых числа:
- XID — идентификатор объекта на момент его создания.
- DBID — идентификатор базы данных, в которой этот объект был создан.
Строковое представление
В строковом представлении RUID имеет следующий вид: "xid_dbid". Обычно, РУИД в строковом представлении используется при вызове функции gdcBaseManager.GetIDByRUIDString. Например:
gdcBaseManager.GetIDByRUIDString("147012468_486813904")
Хранение RUID в базе данных
Связи между идентификатором записи в текущей базе данных и ее РУИДом хранятся в таблице GD_RUID.
Присвоение RUID объекту
RUID присваивается объекту в следующих случаях:
- При сохранении объекта в базе данных (метод Post), если работа осуществляется под учетной записью Administrator.
- В момент открытия диалогового окна Свойства объекта.
- В процессе сохранения объекта в поток.
Присвоить РУИДы всем записям в базе можно с помощью следующего запроса:
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)