Как я могу обеспечить транзакцию только для чтения в SqLite? - PullRequest
2 голосов
/ 10 сентября 2011

У меня есть открытый интерфейс, который позволяет людям взаимодействовать с базой данных, набирая команды sql.Однако я не хочу, чтобы они каким-либо образом изменяли базу данных (и, если возможно, не обращались к определенным таблицам).Как я понимаю, SQLite не имеет понятия о пользователях, так как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2012

Если в запросе нет определенных приложением функций sql, которые косвенно изменяют базу данных (например: SELECT eval('DELETE FROM t1') FROM t2;), то используйте sqlite3_stmt_readonly, чтобы определить, записывает ли подготовленный оператор sql базу данных, в противном случае выможет попытаться открыть другое read_only соединение с базой данных handler(SQLITE_OPEN_READONLY), которое будет использоваться для доступа read_only.

2 голосов
/ 10 сентября 2011

Сначала скопируйте файл "master" базы данных и откройте его :-) Нет, действительно, это серьезное предложение.

В противном случае, в зависимости от способа доступа к SQLite, флаг SQLITE_OPEN_READONLY может быть передан в sqlite3_open_v2. Это относится ко всему соединению - и ко всем транзакциям в этом соединении.

Другой вариант - ограничить запись SQL, но это очень и очень трудно сделать правильно, и поэтому я не рекомендую этот маршрут.

Удачного кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...