Ошибка Firebird: Попытка обновления базы данных только для чтения - PullRequest
0 голосов
/ 15 апреля 2019

Я использую базу данных Firebird версии 2.0. Когда я пытаюсь обновить строку, я получаю сообщение об ошибке: Попытка обновления базы данных только для чтения.

http://www.firebirdfaq.org/faq359/ предполагает, что я могу запросить поле большого двоичного объекта, которое использует набор символов, отличный от набора символов подключения.

Я запрашиваю поле BLOB-объекта, и когда поле BLOB-объекта имеет значение, обновление вызывает ошибку. Если в BLOB-объекте нет значения, тогда обновление просто в порядке.

Я использую IBConsole, чтобы открыть базу данных firebird и проверить метаданные базы данных. Я считаю, что метаданные говорят: «Набор символов по умолчанию НЕТ».

Чтобы решить эту проблему, я сначала должен знать, какие наборы символов используются в моей базе данных.

Итак, мои вопросы:

  1. какой набор символов используется для моей базы данных (набор символов подключения)

  2. тип данных поля BLOB-объектов - MEMOBLOB, и MEMOBLOB создается как Создать домен MEMOBLOB как BLOB-тип под_типа TEXT размер сегмента 80; Так какой набор символов используется для MEMOBLOB?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2019

Нет, речь идет не о запросах или BLOB.

Базы данных Firebird имеют несколько режимов, один из которых «только для чтения».В этом режиме никакие изменения в базе данных не допускаются.

Вы можете использовать утилиту gfix для изменения этого режима базы данных.Вы также можете использовать соответствующее меню в IBExpert и других инструментах разработки, которые используют Firebird Services API

Сама ссылка, которую вы разместили - http://www.firebirdfaq.org/faq359/ - говорит, что:

Itне означает, что файл базы данных доступен только для чтения, но он (база данных) содержит метку только для чтения

  • gfix -mode read_only / path / to /database.fdb
  • gfix -mode read_write /path/to/database.fdb

См. также https://www.firebirdsql.org/manual/gfix-dbmode.html

См. также https://www.ibexpert.net/ibe/pmwiki.php?n=Doc.DatabaseProperties


По касательным вопросам:

набор символов, используемый для моей базы данных

Согласно вашему тексту, он НЕТ.

Комуесли быть точным, база данных не использует некоторые кодировки.Это каждый текстовый столбец (char / varchar / blob sub_type text).Но обычно разработчик не заботится об указании отдельных кодировок для каждого столбца, поэтому они наследуют эту кодировку по умолчанию.

Читайте также: https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-ddl-tbl.html#fblangref25-ddl-tbl-character

метаданные говорят: «Набор символов по умолчанию НЕТ»

Это настолько близко к "кодировке базы данных", насколько это возможно.

Конечно, это только по умолчанию единица, и вы можете переопределить его при создании столбцов, но я не думаю, что ты сделал.Так что, вероятно, все ваши текстовые столбцы имеют кодировку "NONE".

Это довольно опасный параметр, означающий, что все тексты в таких столбцах хранятся в виде необработанного байтового дампа, и надеется, что приложение правильно угадает, как преобразовать байты в буквы ибуквы в байтах.

Подробнее: https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-datatypes-chartypes.html

По умолчанию Flame Robin не показывает кодировку, но, возможно, в разделе DDL это произойдет.http://www.flamerobin.org/images/screenshots/0.6.0/gtk2/property_page.png

IBExpert делает: https://www.ibexpert.net/ibe/uploads/Doc/dmiles783.gif

(набор символов соединения)

.... is not "набор символов, используемый базой данных", это набор символов, используемый, ну, в общем, соединением вашего приложения (например, IBConsole или FlameRobin или IBExpert) с базой данных.Вы должны установить его в свойствах подключения каждого приложения.Самый простой вариант - UTF-8, но если у вас есть столбцы NONE-charset, он может потерпеть неудачу ...

Например, в FR: http://www.flamerobin.org/images/screenshots/0.7.1/winxp/databaseinfo.png

Вы можете использовать monitoring tables для запросадля идентификатора набора символов вашего CURRENT_CONNECTION, см. больше в https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref-appx05-monattach.html

1 голос
/ 16 апреля 2019

После того, как я добавлю параметры транзакции для соответствующих таблиц.Это решает проблему.Значение параметра, которое я добавил, это isc_tpb_lock_write и isc_tpb_shared.

Спасибо, Arioch 'The.

...