Расухание базы данных

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 май 2007, 10:40

Объясните мне тёмному, нафиг нужно криптование, если я могу подключиться IBExpert'ом и читать через UDF эти данные в открытом виде?
Наверное, защита на случай, если хекс-редактором прямо в файл базы будут смотреть? Гы.
Что-то мне подсказывает, что криптование - сугубо клиентское дело, и открытые данные гоняться не должны.

ivl
Сообщения: 59
Зарегистрирован: 22 мар 2006, 15:29

Сообщение ivl » 16 май 2007, 13:41

И какая разница что будет пухнуть - база или темп ?
Разница есть. Темп и база могут находиться на разных носителях.
Базу можно разместить на временном устройстве (например на флэшке), а темп на жестком диске, где места много и пухнуть есть куда.
Если каждое чтение в отдельной тр-ции затрагивает 200 блобов (а не так, как в примере), то она один раз 'распухнет' на 200 блобов и всё.
Если я в ОДНОЙ транзакции детаю 20 выборок по 200 записей или 4000 по одной записи, то это одно и тоже -- распухнет на 4000.
Чтобы сильно не пухло придется делать так: 200 выбрал -- COMMIT.
И я не верю, что все эти 200 блобов тебе нужны на клиенте одновременно.
Верь. Ровно столько нужно для подготовки распечатки.
Объясните мне тёмному, нафиг нужно криптование, если я могу подключиться IBExpert'ом и читать через UDF эти данные в открытом виде?
Для того чтобы раскриптовать нужно ещё ключ знать. Ключ в базе не хранится. В IBExpert введи сначала ключ, а потом увидишь результат. А без ключа ничего не увидишь.
Что-то мне подсказывает, что криптование - сугубо клиентское дело, и открытые данные гоняться не должны.
Моя цель обеспечить безопасность хранения.
Безопасность передачи данных по сети должна обеспечиваться средствами сетевой безопасности. И вообще мы ушли сильно далеко от темы.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 16 май 2007, 17:57

И вообще мы ушли сильно далеко от темы.
любые закрытые методы шифрования обычно взламываются самым неожиданным и примитивным способом.
Спрашивая о том, что ты делаешь, мы не пытаемся выведать "военные секреты". Не хочешь - не надо.

ivl
Сообщения: 59
Зарегистрирован: 22 мар 2006, 15:29

Сообщение ivl » 16 май 2007, 20:17

любые закрытые методы шифрования обычно взламываются самым неожиданным и примитивным способом.
Спрашивая о том, что ты делаешь, мы не пытаемся выведать "военные секреты". Не хочешь - не надо.
С этим я и спорить не буду, всё можно взломать. Ну перенесу я все это шифрование в клиент, так эта проблема вылезет с блоб полями на чем-то другом. Использование UDF скорее всего не единственный способ создания большого числа временных блоб.
Мне жаль, что нельзя организовать работу с выборкой таким образом, чтобы мусор удалялся сразу после передачи данных на клиета. Поясню, что имею в виду: создаём гипотетическую модификацию оператора SELECT, которая работает следующим образом:
1. выбрали запись на клиент,
2. Забрали блоб,
3. Выбрали следующую запись,
4. Если в промежутке между 1 и 3 мы не назначили выбранный блоб никакой таблице, то он освобождается, а занятое им место и его идентификатор, сразу, до окончания транзакции, используется для следующего блоб.
Таким образом, если мы не назначили ни одного блоб поля таблицам, то можно существенно сэкономить место.
Я не знаю внутренний механизм формирования и передачи выборки в Firebird, но я думаю мне все-таки скажут почему такой подход невозможен?
Что касается того, почему я так ревностно отношусь к экономии места, то причина очень простая: база данных должна находиться на флэшке (а у них объем невелик). Понимаю, что сказанным выше навлеку на себя праведный гнев. Сам понимаю, что это бред и чем это всё мне грозит. Но это требование заказчика...

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 17 май 2007, 00:49

ivl писал(а):Поясню, что имею в виду: создаём гипотетическую модификацию оператора SELECT, которая работает следующим образом:
1. выбрали запись на клиент,
2. Забрали блоб,
3. Выбрали следующую запись,
4. Если в промежутке между 1 и 3 мы не назначили выбранный блоб никакой таблице, то он освобождается, а занятое им место и его идентификатор, сразу, до окончания транзакции, используется для следующего блоб
RTFM isc_cancel_blob

ivl
Сообщения: 59
Зарегистрирован: 22 мар 2006, 15:29

Сообщение ivl » 17 май 2007, 10:30

RTFM isc_cancel_blob
Но это не совсем то. Это же функция API. Но как мне при использовании
IBX в Delphi её туда прикрутить? Или мне всё на API переделать?
Прикрутить можно, конечно, но это будет как-то не очень...
Я же говорил о другом: о реализации похожего механизма только средствами SQL. Или я что-то упустил из виду?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 17 май 2007, 10:40

ivl писал(а):
RTFM isc_cancel_blob
Но это не совсем то. Это же функция API. Но как мне при использовании
IBX в Delphi её туда прикрутить? Или мне всё на API переделать?
Я же говорил о другом: о реализации похожего механизма только средствами SQL. Или я что-то упустил из виду?
Всё делается через АПИ. Тебе шашечки или ехать ?

Делаешь наследника TIBBlobStream, перекрываешь у него CloseBlob и используешь его для работы с блобами.

ivl
Сообщения: 59
Зарегистрирован: 22 мар 2006, 15:29

Сообщение ivl » 17 май 2007, 11:15

Всё делается через АПИ. Тебе шашечки или ехать ?
Это ясно, что все через АПИ. Просто хотелось оставаться на более высоком уровне абстракции (шашечек)
Делаешь наследника TIBBlobStream, перекрываешь у него CloseBlob и используешь его для работы с блобами.
Попробую думать в этом направлении.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 май 2007, 15:57

о реализации похожего механизма только средствами SQL.
в SQL нет никаких "механизмов" управления blob. И не может быть по определению.

ivl
Сообщения: 59
Зарегистрирован: 22 мар 2006, 15:29

Сообщение ivl » 18 май 2007, 19:02

В продолжение темы хочу спросить, будут ли созданы новые блоб при выполнении такой конструкции:

Код: Выделить всё

  CREATE PROCEDURE TEST_PROC RETURNS (
     BL1 BLOB,
     BL2 BLOB)
  AS
  BEGIN
     FOR SELECT BLOB_FIELD1, BLOB_FIELD2 FROM TEST_TABLE
     INTO :BL1, :BL2 DO SUSPEND;
  END
Или же это приведет к возврату идентификаторов уже реально существующих? То есть будет ли использован Firebird один и тот же объем памяти при выполнении операторов

Код: Выделить всё

  SELECT * FROM TEST_PROC;
И

Код: Выделить всё

  SELECT * FROM TEST_TABLE;

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 19 май 2007, 00:03

ivl писал(а):В продолжение темы хочу спросить, будут ли созданы новые блоб при выполнении такой конструкции
Не должны.
Это легко проверить - старшее двойное слово blob_id всегда 0 для временных (новых) блобов

Ответить