RUID
SYSDBA (обсуждение | вклад) |
Alex (обсуждение | вклад) |
||
| (не показаны 17 промежуточных версий 2 участников) | |||
| Строка 1: | Строка 1: | ||
| − | RUID (Record Unique Identifier) — уникальный идентификатор записи | + | '''RUID (Record Unique Identifier)''' — уникальный идентификатор записи для всех существующих в природе баз данных системы [[Гедымин]]. |
| − | В пределах файла базы данных все объекты имеют уникальный целочисленный идентификатор благодаря использованию одного генератора [[gd_g_dbid]]. Каждая база данных имеет свой уникальный целочисленный идентификатор [[DBID]], который хранится в генераторе [[gd_g_dbid]]. RUID объекта — это два целых числа: идентификатор объекта | + | В пределах файла базы данных все объекты имеют уникальный целочисленный идентификатор благодаря использованию одного на все таблицы генератора [[gd_g_dbid]]. Каждая база данных имеет свой уникальный целочисленный идентификатор [[DBID]], который хранится в генераторе [[gd_g_dbid]]. RUID объекта — это два целых числа: |
| + | |||
| + | # XID — идентификатор объекта на момент его создания. | ||
| + | # DBID — идентификатор базы данных, в которой этот объект был создан. | ||
==== Строковое представление ==== | ==== Строковое представление ==== | ||
| − | В строковом представлении RUID имеет следующий вид: " | + | В строковом представлении RUID имеет следующий вид: '''"xid_dbid"'''. Обычно, РУИД в строковом представлении используется при вызове функции [[GdcBase.TgdcBaseManager.GetIDByRUIDString|gdcBaseManager.GetIDByRUIDString]]. Например: |
gdcBaseManager.GetIDByRUIDString("147012468_486813904") | gdcBaseManager.GetIDByRUIDString("147012468_486813904") | ||
| + | |||
| + | Строка РУИДа должна соответствовать следующему формату: | ||
| + | |||
| + | <syntaxhighlight lang="SQL"> | ||
| + | SIMILAR TO '([[:DIGIT:]]{9,10}\_[[:DIGIT:]]+)|([[:DIGIT:]]+\_17)' ESCAPE '\' | ||
| + | </syntaxhighlight> | ||
==== Хранение RUID в базе данных ==== | ==== Хранение RUID в базе данных ==== | ||
Связи между идентификатором записи в текущей базе данных и ее РУИДом хранятся в таблице [[GD_RUID]]. | Связи между идентификатором записи в текущей базе данных и ее РУИДом хранятся в таблице [[GD_RUID]]. | ||
| + | |||
| + | ==== Присвоение RUID объекту ==== | ||
| + | |||
| + | RUID присваивается объекту в следующих случаях: | ||
| + | |||
| + | * При сохранении объекта в базе данных (метод [[gdcBase.TgdcBase.Post|Post]]), если работа осуществляется под учетной записью [[Administrator]]. | ||
| + | * В момент открытия [[Окно Свойста Объекта|диалогового окна Свойства объекта]], если окно закрыто по кнопке OK. | ||
| + | * В процессе [[Бизнес-объект. Сериализация данных|сохранения объекта в поток]]. | ||
| + | |||
| + | Присвоить РУИДы всем записям из одной таблицы можно с помощью следующего запроса: | ||
| + | |||
| + | <syntaxhighlight lang="SQL"> | ||
| + | MERGE INTO gd_ruid r | ||
| + | USING (SELECT id FROM gd_contact 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, 650002) | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | Для примера мы использовали таблицу [[GD_CONTACT]]. | ||
| + | |||
| + | Присвоить РУИДы записям из всех таблиц в базе можно с помощью следующего запроса: | ||
| + | |||
| + | <syntaxhighlight lang="SQL"> | ||
| + | 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 | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | ==== Изменение РУИД для существующего объекта ==== | ||
| + | |||
| + | Команда изменения РУИДа для существующего объекта находится на панели инструментов в окне Редактора SQL. Подробная информация находится [[GdcBase.TgdcBaseManager.ChangeRUID|здесь]]. | ||
| + | |||
| + | ==== Использование RUID в запросах ==== | ||
| + | |||
| + | При помощи [[Метапеременные в SQL запросах|метапеременной]] RUID в SQL запросах можно получить идентификатор записи в текущей базе данных по ее РУИДу. | ||
| + | |||
| + | Синтаксис: | ||
| + | <RUID XID="xid_number" DBID ="dbid_number"/> | ||
| + | |||
| + | ==== См. также ==== | ||
| + | |||
| + | * [[ID і RUID]] | ||
| + | * [[Удаление из GD_RUID записей для несуществующих объектов]] | ||
| + | * [[Поиск записи по заданному RUID]] | ||
[[Category:База данных]] | [[Category:База данных]] | ||
| + | [[Category:Руководство разработчика]] | ||
| + | |||
| + | __NOTOC__ | ||
Текущая версия на 10:35, 27 ноября 2024
RUID (Record Unique Identifier) — уникальный идентификатор записи для всех существующих в природе баз данных системы Гедымин.
В пределах файла базы данных все объекты имеют уникальный целочисленный идентификатор благодаря использованию одного на все таблицы генератора gd_g_dbid. Каждая база данных имеет свой уникальный целочисленный идентификатор DBID, который хранится в генераторе gd_g_dbid. RUID объекта — это два целых числа:
- XID — идентификатор объекта на момент его создания.
- DBID — идентификатор базы данных, в которой этот объект был создан.
[править] Строковое представление
В строковом представлении RUID имеет следующий вид: "xid_dbid". Обычно, РУИД в строковом представлении используется при вызове функции gdcBaseManager.GetIDByRUIDString. Например:
gdcBaseManager.GetIDByRUIDString("147012468_486813904")
Строка РУИДа должна соответствовать следующему формату:
SIMILAR TO '([[:DIGIT:]]{9,10}\_[[:DIGIT:]]+)|([[:DIGIT:]]+\_17)' ESCAPE '\'
[править] Хранение RUID в базе данных
Связи между идентификатором записи в текущей базе данных и ее РУИДом хранятся в таблице GD_RUID.
[править] Присвоение RUID объекту
RUID присваивается объекту в следующих случаях:
- При сохранении объекта в базе данных (метод Post), если работа осуществляется под учетной записью Administrator.
- В момент открытия диалогового окна Свойства объекта, если окно закрыто по кнопке OK.
- В процессе сохранения объекта в поток.
Присвоить РУИДы всем записям из одной таблицы можно с помощью следующего запроса:
MERGE INTO gd_ruid r USING (SELECT id FROM gd_contact 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, 650002)
Для примера мы использовали таблицу GD_CONTACT.
Присвоить РУИДы записям из всех таблиц в базе можно с помощью следующего запроса:
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
[править] Изменение РУИД для существующего объекта
Команда изменения РУИДа для существующего объекта находится на панели инструментов в окне Редактора SQL. Подробная информация находится здесь.
[править] Использование RUID в запросах
При помощи метапеременной RUID в SQL запросах можно получить идентификатор записи в текущей базе данных по ее РУИДу.
Синтаксис:
<RUID XID="xid_number" DBID ="dbid_number"/>