powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
23 сообщений из 23, страница 1 из 1
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38321554
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Начиналось все с того, что потребовалось сохранять в базе пользовательские настройки положения столбцов в гриде, их видимость и т.п. Появилась соответствующая таблица, в которой для определенного перечня наборов данных перечислены столбцы и из параметры, что-то типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table COLUMNS(
  DataSet_ID integer,
  Column_Idx integer,
  Caption varchar(30),
  Is_Visible d_boolean,
  Field_Type integer,
  Field_Sub_Type integer,
  Field_Length integer,
  Width integer);

Позднее появилась мастер-таблица для нее, в которую вынесены параметры самих наборов данных:
Код: sql
1.
2.
3.
4.
5.
6.
create table DATASETS(
  ID integer,
  Object_Type integer, /* 1 - таблица, 2 - просмотр, 3 - ХП */
  Object_Name varchar(31),
  Where_Clause varchar(255),
  Order_Clause varchar(255));

Значительная часть НД относится к генерации отчетов и в них время от времени меняются поля. Возникло резонное желание автоматизировать процесс переноса информации об изменении метаданных о полях из таблиц в Subj в таблицу Columns, просится триггер AIUD на две системные таблицы. Есть ли подводные камни у такого решения и противопоказания?
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38321565
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эти триггера не переживут backup/restore
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38321567
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры на системные таблицы не бэкапятся и, соответственно, их не будет в отресторенной базе. Это как минимум.
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38321578
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если проверять наличие триггеров в триггере на ON CONNECT, то ведь можно их и создать при отсутствии.
Какие косяки могут быть в этом случае?
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38321587
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrэти триггера не переживут backup/restoreМ-да, тогда смысл теряется... Т.е. единственный вариант - ручной запуск некой ХП по факту внесения изменений?
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38321592
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,
что называется "пользуясь случаем":
есть небольшое неудобство при создании SP в IBExpert, а именно dropdown-список доменов при выборе типа поля не отсортирован по умолчанию ни по имени, ни по другому признаку, что не очень удобно при объемном списке доменов :-)
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38321620
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill Razuvaevесть небольшое неудобство при создании SP в IBExpert, а именно dropdown-список доменов при выборе типа поля не отсортирован по умолчанию ни по имени, ни по другому признаку, что не очень удобно при объемном списке доменов :-)

Там по любой колонке можно отсортировать, и сортировка запоминается. Посмотри внимательно, не отсортировано ли по какой-то другой колонке.
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38321645
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertТам по любой колонке можно отсортировать, и сортировка запоминается. Посмотри внимательно, неотсортировано ли по какой-то другой колонке.Кхм... Интересно, у меня почему-то там стояло по чарсету... Спасибо.
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38321707
Фотография CyberMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevIBExpertТам по любой колонке можно отсортировать, и сортировка запоминается. Посмотри внимательно, неотсортировано ли по какой-то другой колонке.Кхм... Интересно, у меня почему-то там стояло по чарсету... Спасибо.
Посмотрел у себя - то же самое. Сортировка стоит по чарсету....
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38325294
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,
и сортировка, кстати, не сохраняется. При создании новой процедуры опять по чарсету...
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38325357
Евгений Килин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill Razuvaevпросится триггер AIUD на две системные таблицы. Есть ли подводные камни у такого решения и противопоказания?
dimitrэти триггера не переживут backup/restore
26.04.2011 12:30 ДЕ:
"Еще лет 10 назад на всех углах кричали, что триггера на системные таблицы могут:

а) вообще не работать (редко)
б) не работать после переподключения (часто)
в) теряться после рестора (всегда)

И фиксить это никто не будет :-)"

Пункты а и б уже не актуальны? :)
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #38325372
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений Килин,

я озвучил лишь 100%-но гарантированный результат :-)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954378
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конкретно по таблице RDB$RELATION_FIELDS в FIREBIRD 1.5 (разных сборок) никаких проблем с триггерами не было, ни после переподключения, ни после рестора, работали как часы.
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954380
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggoryв FIREBIRD 1.5

Однако, ты некрофил. С любой стороны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954382
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FB 3 уже не дает создавать триггеры. Пишет CREATE TRIGGER ... failed. no permission for ALTER access to TABLE RDB$RELATION_FIELDS. У кого-нибудь получилось обойти это ограничение?

Также в новых версиях Firebird появился UNIQUE (RDB$FIELD_NAME, RDB$RELATION_NAME), но вшений ключ на него не добавляется. Пишет no permission for REFERENCES access to TABLE RDB$RELATION_FIELDS. Тоже засада.
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954384
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перестань мучить трупы и открой для себя DDL триггера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954385
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Перестань мучить трупы и открой для себя DDL триггера.


А как с их помощью них можно отследить изменение имени поля таблицы? Единственная переменная, в которой можно найти имя поля - rdb$get_context('DDL_TRIGGER', 'SQL_TEXT'). Но там SQL-запрос, его нужно парсить, а это не такая простая задача. Может я не догнал чего-то? Ткните, пожалуйста!
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954386
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggoryА как с их помощью них можно отследить изменение имени поля таблицы?

Сравнивая новое имя со старым.

Но, собственно говоря, зачем? Поля идентифицируются по номеру.
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954388
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggory,

сама идея отследить какое поле переименовали бредовая, хотя бы потому что за одну DDL команду можно переименовать несколько полей. Да и вообще в чём задача то?
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954391
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
ggreggoryА как с их помощью них можно отследить изменение имени поля таблицы?

Сравнивая новое имя со старым.

Но, собственно говоря, зачем? Поля идентифицируются по номеру.

Правильно ли я понимаю, что речь о поле RDB$RELATION_FIELDS.RDB$FIELD_ID ? И Ваша идея заключается в том, что, например, в триггере BEFORE сохранить во временном контексте названия полей по их номеру из RDB$FIELD_ID. А потом в триггере AFTER сравнить новые имена полей с теми, что были сохранены в триггере BEFORE ?
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954393
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
ggreggory,

сама идея отследить какое поле переименовали бредовая, хотя бы потому что за одну DDL команду можно переименовать несколько полей. Да и вообще в чём задача то?


Да-да, в том то и дело, что триггер срабатывает единократно, а внутри может быть куча изменений в таблице - и добавление, и удаление, и изменение полей и добавление ключей. Но тут выше предложили классную идею с идентификацией по номеру поля. Возможно, это выход!
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954395
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggoryИ Ваша идея заключается в том, что, например, в триггере BEFORE сохранить во временном
контексте названия полей по их номеру из RDB$FIELD_ID. А потом в триггере AFTER сравнить
новые имена полей с теми, что были сохранены в триггере BEFORE ?
Моя идея заключается в том, что тебе вообще не нужно отслеживать переименование
полей. Ты либо даёшь полям осмысленные имена и тогда их переименование меняет их значение
и старые атрибуты уже не должны применяться к полю с новым имененм, либо даёшь
бессмысленные имена (как у Болтика) и никогда их не переименовываешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
    #39954441
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Так сложилось, необходимость в этом есть, это работает уже 15 лет, но на FB 1.5. Нужно такое было и на FB 3 организовать.

Спасибо за идею, всё работает!
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггеры на RDB$RELATION_FIELDS и RDB$RELATION_FIELDS
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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