|
|
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
Почти у всех системных таблиц есть поле "DESCRIPTION BLOB SUB_TYPE 1 CHARACTER SET UNICODE_FSS". Но кроме описания имхо было бы удобно иметь возможность хранить и другую инфу, ту которая нужна разработчику БД. Короче хочется кой-чего похранить для таблиц, вьюх, полей, триггеров, индексов, процедур и функций (+их аргументов), UDF, доменов, констрейнтов. Ещё возможно для ролей, привилегий пользователя, да и для самих пользователей (пользователей вроде можно будет в тройке хранить прям в базе, если я ничего не путаю). Хотя вот сейчас подумал ещё... Ещё более удобно было бы добавлять поля к этим системным таблицам ALTER-ом, и работать с этими полями как с обычными. Это было бы ещё правильней, с точки зрения разработчика БД :) Проверил через IBExpert - блин, а ведь можно добавить поле к системной таблице :) Добавил поле: Код: sql 1. IBExpert предложил ввести значение , т.к. поле NOT NULL. Сначала я ввёл 1, а потом, при следующей попытке (после неудачного B/R (см.ниже)), я ввёл GEN_ID(GEN_RELATION_ID, 1). Ок. Получил возможность ссылаться на таблицу по ID. Дальше выполняю: Код: sql 1. 2. 3. Ок. Дальше выполняю: Код: sql 1. 2. 3. 4. 5. 6. 7. Ok. Дальше выполняю: Код: sql 1. 2. 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. Ok. процедурка TURN_LOG_FOR_TABLE создаст (или удалит) триггеры для логирования изменений данных в табличке с указанным ID. Т.е при Код: sql 1. и после коммита, мы получаем логирование для всех несистемных таблиц. И после 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. Столько вариантов использования придумывается... :) Мечта прям :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 12:25:53 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
забудь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 12:30:12 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
NickDeeЭто было бы ещё правильней, с точки зрения разработчика БД :) ты путаешь свои собственные структуры со структурами словаря БД. Так что правильней это не будет. NickDeeПоле ID пропало из RDB$RELATIONS. понимаешь, почему пропало? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 13:46:02 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
dimitrзабудь Хочешь сказать, что на данном этапе это не вписывается в твои понимания о добре и зле архитектуру? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 14:03:09 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
NickDee, в тройке как раз наоборот вроде думают запретить правку системных таблиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 14:31:35 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
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, там сработал триггер, который пересоздал триггеры логирования), и всё. Да, это было бы ещё удобней :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 14:50:04 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисNickDee, в тройке как раз наоборот вроде думают запретить правку системных таблиц Запретить править системные поля системных таблиц - это очень и очень правильно. Но RDB$DESCRIPTION вот добавили, и разрешили менять отдельным sql-стэйтментом. Ну ещё можно добавить полей, а изменять их уже через sql. А системные сделать read-only. Это вопрос по-моему вторичный - чем менять :) И добавлять поля можно разрешить не во все таблицы, а только в те, которые не меняются сами по себе (я про MON$). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 15:00:49 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
NickDee, добавь себе еще сколько нужно таблиц и не морочь людям голову. системные таблицы создаются не скриптом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 15:24:47 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
NickDeeЯ думаю что просто не реализован такой функционал. не думаешь. база данных всегда создается с готовым набором системных таблиц. Собственно, можно сказать что "болванка" БД вшита в сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 18:16:42 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
kdvNickDeeЯ думаю что просто не реализован такой функционал. не думаешь. база данных всегда создается с готовым набором системных таблиц. Собственно, можно сказать что "болванка" БД вшита в сервер. Вот когда мы делаем рестор, то в случае обычных таблиц там делается CREATE TABLE, а потом переливаются данные через insert. А в случае системных таблиц можно сделать ALTER TABLE, и так же перелить данные, но уже через update. Имхо это вопрос воли :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 18:38:38 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
NickDee, тогда сделай свой gbak. что тебя останавливает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 19:30:14 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
NickDee, я бы вообще запретил делать alter системным таблицам, на уровне движка БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2013, 21:46:29 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
NickDeeЗапретить править системные поля системных таблиц - это очень и очень правильно. неплохо, все-таки оставить возможность убирать/криптовать текст процедур. иногда полезно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2013, 16:01:08 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, а в тройке запретят только DDL-операции над системными таблицами, или DML тоже? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 17:35:30 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
Кстати в fb-devel видел обсуждение синтаксиса добавления именованных атрибутов к пользователю. И так и не понял, чем плохо добавлять атрибуты обычным alter table, и потом менять их через update, и селектить селектом? Зачем придумывать отдельный синтаксис для создания, удаления, обновления, и селекта атрибутов? И ещё сами атрибуты получаются нетипизированные. И констрейнтов не навесить. И права не раздать. И в IBExpert не посмотреть через просмотр таблицы sec$users. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 18:12:22 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
NickDeeКстати в fb-devel видел обсуждение синтаксиса добавления именованных атрибутов к пользователю. И так и не понял, чем плохо добавлять атрибуты обычным alter table, и потом менять их через update, и селектить селектом? Зачем придумывать отдельный синтаксис для создания, удаления, обновления, и селекта атрибутов? И ещё сами атрибуты получаются нетипизированные. И констрейнтов не навесить. И права не раздать. И в IBExpert не посмотреть через просмотр таблицы sec$users. В твоем вопросе 90% ответа :). Именно поэтому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 18:20:14 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
MrCat, по хорошему надо и то и другое запрещать, т.к. и то и другое грязный хак. И если DML над системными таблицами хоть как-то можно оправдать из-за отсутствия некоторых DDL опреций (до тройки), то DDL над системными никак. Вот что мешает дополнительные аттрибуты хранить в обычных таблицах? Ведь после б/р все ваши дополнительные поля и триггеры пропадут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 18:23:58 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
NickDee, Пешков засомневался. Возможно для аттрибутов пользователей сделают sec$user_attributes ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 18:25:45 |
|
||
|
Хотелка про системные таблицы
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисВот что мешает дополнительные аттрибуты хранить в обычных таблицах? Вот я тоже удивляюсь почему ради одного извращенца Алекс так бросился корёжить системные вещи вместо того, чтобы посоветовать ему завести собственную таблицу для атрибутов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2013, 19:12:52 |
|
||
|
|

start [/forum/topic.php?fid=40&tid=1564051]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
210ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 524ms |

| 0 / 0 |
