powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хотелка про системные таблицы
20 сообщений из 20, страница 1 из 1
Хотелка про системные таблицы
    #38484334
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почти у всех системных таблиц есть поле "DESCRIPTION BLOB SUB_TYPE 1 CHARACTER SET UNICODE_FSS". Но кроме описания имхо было бы удобно иметь возможность хранить и другую инфу, ту которая нужна разработчику БД.

Короче хочется кой-чего похранить для таблиц, вьюх, полей, триггеров, индексов, процедур и функций (+их аргументов), UDF, доменов, констрейнтов. Ещё возможно для ролей, привилегий пользователя, да и для самих пользователей (пользователей вроде можно будет в тройке хранить прям в базе, если я ничего не путаю).

Хотя вот сейчас подумал ещё... Ещё более удобно было бы добавлять поля к этим системным таблицам ALTER-ом, и работать с этими полями как с обычными. Это было бы ещё правильней, с точки зрения разработчика БД :)

Проверил через IBExpert - блин, а ведь можно добавить поле к системной таблице :)
Добавил поле:
Код: sql
1.
ALTER TABLE RDB$RELATIONS ADD ID INTEGER NOT NULL 


IBExpert предложил ввести значение , т.к. поле NOT NULL. Сначала я ввёл 1, а потом, при следующей попытке (после неудачного B/R (см.ниже)), я ввёл GEN_ID(GEN_RELATION_ID, 1).
Ок. Получил возможность ссылаться на таблицу по ID.

Дальше выполняю:
Код: sql
1.
2.
3.
ALTER TABLE RDB$RELATIONS
ADD CONSTRAINT PK_RDB$RELATIONS
PRIMARY KEY (ID)

Ок.

Дальше выполняю:
Код: sql
1.
2.
3.
4.
5.
6.
7.
create trigger rdb$relations_bi for rdb$relations
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_relation_id,1);
end

Ok.

Дальше выполняю:
Код: sql
1.
2.
CREATE TABLE T (
    ID INTEGER)

This operation is not defined for system tables.
unsuccessful metadata update.
STORE RDB$RELATIONS failed.
validation error for column ID, value "*** null ***".

Ещё я попробовал сделать B/R этой базы. Поле ID пропало из RDB$RELATIONS.
А счастье было так близко... :)

Было бы удобно, если бы пользовательские поля переживали B/R как и RDB$DESCRIPTION.
Ну и чтобы триггеры таки срабатывали :)
Это я на 2.5 экспериментировал.

А если идти ещё дальше, то я бы не отказался от возможности сделать так:
Создаём в RDB$RELATIONS поле IS_LOGGED BOOLEAN NOT NULL DEFAULT FALSE, и поле ID из примера выше.
Изменение значения поля IS_LOGGED ловим в триггере на update:
Код: sql
1.
2.
3.
4.
5.
6.
7.
as
begin
  if OLD.ID <> NEW.ID then
    EXCEPTION ASSERT;
  if NEW.IS_LOGGED <> OLD.IS_LOGGED  then
    TURN_LOG_FOR_TABLE(OLD.ID, NEW.IS_LOGGED);
end

Ok.

процедурка TURN_LOG_FOR_TABLE создаст (или удалит) триггеры для логирования изменений данных в табличке с указанным ID.
Т.е при
Код: sql
1.
UPDATE RDB$RELATIONS SET IS_LOGGED = TRUE WHERE (RDB$RELATION_TYPE = 0) AND (RDB$SYSTEM_FLAG = 0)


и после коммита, мы получаем логирование для всех несистемных таблиц.
И после B/R хочется чтобы ничего не поломалось :)
Также для нужд логирования я бы хотел создать поля ID, RELATION_ID и IS_LOGGED в табличке RDB$RELATION_FIELDS, и написать триггер, отлавливающий изменение поля IS_LOGGED и типа(вдруг кто ALTER-ом тип поля изменит). В этом триггере пересоздавал бы при необходимости триггеры логирования.
И триггер на удаление для RDB$RELATION_FIELDS тоже потребуется, чтобы исключить поле из триггеров на логирование (если таблица логируется и если у текущего поля IS_LOGGED = TRUE).

Если бы такая функциональность была уже сейчас, то можно было бы запускать логирование на раз-два на любой базе, почти "из коробки", не теряя при этом возможность свободно манипулировать метаданными.

Я бы с удовольствием добавил бы несколько полей в RDB$DATABASE, для глобальных настроек БД :) Имхо им там самое место :)
Точно добавил бы поля в таблицу с пользователями (там самое место для хранения их персональных настроек), добавил бы туда ID, добавил бы IS_OLD BOOLEAN (Типа сотрудник уволился, а ссылки на него в документах остались. Логиниться он не может, и отображать его в справочнике пользователей смысла нет).
Вообще я бы добавлял во все таблицы-справочники поле IS_OLD BOOLEAN, и сделал бы это с помощью триггера, обрабатывающего изменение поля IS_DICTIONARY в RDB$RELATIONS :) Т.е. поставил в IBExpert галку в поле IS_DICTIONARY для соответствующей таблицы, и у этой таблицы сразу поле IS_OLD добавилось (и поле NAME VARCHAR(n)). Нажал галку IS_TREE_DICTIONARY, и у таблицы создалось в добавок поле PARENT_ID :) Нажал галку HAS_MANUAL_ORDER, и у таблицы появилось поле RECORD_ORDER.
Настраивать можно прям не выходя из IBExpert.

Столько вариантов использования придумывается... :) Мечта прям :)
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484338
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забудь
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484389
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЭто было бы ещё правильней, с точки зрения разработчика БД :)
ты путаешь свои собственные структуры со структурами словаря БД. Так что правильней это не будет.

NickDeeПоле ID пропало из RDB$RELATIONS.
понимаешь, почему пропало?
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484402
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrзабудь
Хочешь сказать, что на данном этапе это не вписывается в твои понимания о добре и зле архитектуру? :)
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484410
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

в тройке как раз наоборот вроде думают запретить правку системных таблиц
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484426
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNickDeeПоле ID пропало из RDB$RELATIONS.
понимаешь, почему пропало?
Я думаю что просто не реализован такой функционал.
Для поля RDB$DESCRIPTION он реализован, а для ID - нет.
Думаю причина в этом. Ничего вроде не мешает эти поля так же создавать и восстанавливать в них значения.

Я ещё попробую это (логирование) на уровне DDL триггеров и отдельных (связанных с RDB$*) таблиц сделать.
Т.е. на уровне DDL тригеров нужно будет при добавлении таблицы автоматом создать запись в Ext$Relations (Id, TableName, IsLogged), и создать записи в Ext$RelationFields (Id, TableId, FieldName, IsLogged). Так же нужно будет отлавливать ALTER TABLE T на предмет изменения названия полей, типов, удаления полей. И нужно будет сопоставлять распарсенное с тем, что уже есть в базе (чтобы например при изменении имени поля проапдейтить соответствующую запись в Ext$RelationFields).

А в DDL-триггере (интересен BEFORE) вообще можно создавать или дропать триггеры, таблицы, изменять данные существующих таблиц?

Вот прям хочется получить удобно-настраиваемое (например из IBExpert) логирование :) Создал табличку, ткнул галочку напротив имени таблички в Ext$Relations - получил логирование :) Что ещё может быть удобней? :)
Есть ещё удобней - это если бы не пришлось городить отдельную табличку, а IBExpert сам бы мог из RDB$RELATION_FIELDS поднимать несистемные поля и давать их редактировать пользователю :) А несистемные поля из RDB$RELATION_FIELDS размещал бы прям в гриде где список полей таблицы отображается (т.е. окно где мы поля добавляем в таблицу) - создал поле, поставил галку IsLogged (галка прописалась в RDB$RELATION_FIELDS, там сработал триггер, который пересоздал триггеры логирования), и всё.
Да, это было бы ещё удобней :)
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484430
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисNickDee,

в тройке как раз наоборот вроде думают запретить правку системных таблиц
Запретить править системные поля системных таблиц - это очень и очень правильно. Но RDB$DESCRIPTION вот добавили, и разрешили менять отдельным sql-стэйтментом.
Ну ещё можно добавить полей, а изменять их уже через sql. А системные сделать read-only. Это вопрос по-моему вторичный - чем менять :)
И добавлять поля можно разрешить не во все таблицы, а только в те, которые не меняются сами по себе (я про MON$).
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484442
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

добавь себе еще сколько нужно таблиц и не морочь людям голову.

системные таблицы создаются не скриптом.
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484545
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЯ думаю что просто не реализован такой функционал.
не думаешь. база данных всегда создается с готовым набором системных таблиц. Собственно, можно сказать что "болванка" БД вшита в сервер.
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484557
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNickDeeЯ думаю что просто не реализован такой функционал.
не думаешь. база данных всегда создается с готовым набором системных таблиц. Собственно, можно сказать что "болванка" БД вшита в сервер.
Вот когда мы делаем рестор, то в случае обычных таблиц там делается CREATE TABLE, а потом переливаются данные через insert.
А в случае системных таблиц можно сделать ALTER TABLE, и так же перелить данные, но уже через update.
Имхо это вопрос воли :)
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484604
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

тогда сделай свой gbak. что тебя останавливает?
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38484657
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

я бы вообще запретил делать alter системным таблицам, на уровне движка БД.
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38486120
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЗапретить править системные поля системных таблиц - это очень и очень правильно. неплохо, все-таки оставить возможность убирать/криптовать текст процедур.
иногда полезно.
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38504017
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, а в тройке запретят только DDL-операции над системными таблицами, или DML тоже?
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38504085
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати в fb-devel видел обсуждение синтаксиса добавления именованных атрибутов к пользователю.
И так и не понял, чем плохо добавлять атрибуты обычным alter table, и потом менять их через update, и селектить селектом?
Зачем придумывать отдельный синтаксис для создания, удаления, обновления, и селекта атрибутов? И ещё сами атрибуты получаются нетипизированные. И констрейнтов не навесить. И права не раздать. И в IBExpert не посмотреть через просмотр таблицы sec$users.
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38504095
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeКстати в fb-devel видел обсуждение синтаксиса добавления именованных атрибутов к пользователю.
И так и не понял, чем плохо добавлять атрибуты обычным alter table, и потом менять их через update, и селектить селектом?
Зачем придумывать отдельный синтаксис для создания, удаления, обновления, и селекта атрибутов? И ещё сами атрибуты получаются нетипизированные. И констрейнтов не навесить. И права не раздать. И в IBExpert не посмотреть через просмотр таблицы sec$users.

В твоем вопросе 90% ответа :).
Именно поэтому.
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38504102
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCat,

по хорошему надо и то и другое запрещать, т.к. и то и другое грязный хак. И если DML над системными таблицами хоть как-то можно оправдать из-за отсутствия некоторых DDL опреций (до тройки), то DDL над системными никак. Вот что мешает дополнительные аттрибуты хранить в обычных таблицах? Ведь после б/р все ваши дополнительные поля и триггеры пропадут.
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38504107
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

Пешков засомневался. Возможно для аттрибутов пользователей сделают sec$user_attributes
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38504109
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

так и сделал ксати http://sourceforge.net/p/firebird/code/58945
...
Рейтинг: 0 / 0
Хотелка про системные таблицы
    #38504169
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВот что мешает дополнительные аттрибуты хранить в обычных таблицах?

Вот я тоже удивляюсь почему ради одного извращенца Алекс так бросился корёжить системные
вещи вместо того, чтобы посоветовать ему завести собственную таблицу для атрибутов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Хотелка про системные таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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