![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Это регистрирует отзыв авторизатора в конкретном
соединении с базой данных,
поставляемом в первом аргументе. Авторизатор вызван, поскольку SQL-операторы
собираются sqlite3_prepare() или его
вариантами sqlite3_prepare_v2(),
sqlite3_prepare_v3(),
sqlite3_prepare16(),
sqlite3_prepare16_v2() и
sqlite3_prepare16_v3().
В различных пунктах во время процесса компиляции, когда логика создается,
чтобы выполнить различные действия, авторизатор вызван, чтобы видеть,
позволены ли те действия. Авторизатор должен возвратить
SQLITE_OK, чтобы позволить действие,
SQLITE_IGNORE, чтобы отвергнуть определенное
действие, но позволить SQL-оператору продолжать собираться, или
SQLITE_DENY, чтобы заставить весь SQL-оператор
быть отклоненным с ошибкой. Если авторизатор возвратит какое-либо
значение кроме SQLITE_IGNORE,
SQLITE_OK или
SQLITE_DENY, sqlite3_prepare_v2()
или эквивалентный запрос, который вызвал авторизатор, потерпит неудачу с
сообщением об ошибке. Когда отзыв возвращает SQLITE_OK, это
означает, что операция, которую требуют, в порядке. Когда отзыв возвращает
SQLITE_DENY,
sqlite3_prepare_v2(), который вызвал
авторизатор, потерпит неудачу с сообщением об ошибке, объясняя,
что доступ закрыт. Первый параметр авторизатора это копия третьего параметра
sqlite3_set_authorizer(). Второй параметр это
integer action code, который определяет
конкретное действие, которое будет разрешено. С третьего по шестой параметры
отзыва являются NULL или законченные нолем последовательности, которые
содержат дополнительные детали о действии, которое будет разрешено.
Запросы должны всегда быть готовы столкнуться с NULL в любом из этих
параметров отзыва авторизатора. Если код действия SQLITE_READ
и отзыв возвращает SQLITE_IGNORE,
подготовленный запрос
построен, чтобы поставить NULL вместо столбца таблицы, который был бы
прочитан, если бы вернулся SQLITE_OK.
Возвращение SQLITE_IGNORE может использоваться,
чтобы лишить пользовательского доступа, которому не доверяют, к отдельным
столбцам таблицы. Когда на таблицу ссылается
SELECT, но никакие значения столбцов не
извлечены из той таблицы (например, в запросе вроде
"SELECT count(*) FROM tab"), то
SQLITE_READ отзыв вызван однажды для той таблицы с именем столбца,
которое является пустой строкой. Если код действия
SQLITE_DELETE и отзыв возвращает
SQLITE_IGNORE, DELETE
обрабатывается, но
усеченная оптимизация
отключена, и все строки удалены индивидуально. Авторизатор используется, готовя запрос
SQL из источника, которому не доверяют, чтобы гарантировать, чтобы
SQL-операторы не пытались получить доступ к данным, которые им не разрешают
видеть, или что они не пытаются выполнить злонамеренные запросы, которые
повреждают базу данных. Например, приложение может позволить пользователю
вводить произвольные SQL-запросы для оценки базой данных.
Но приложение не хочет, чтобы пользователь был в состоянии внести
произвольные изменения в базу данных. Авторизатор тогда мог быть использован
как фильтр, отклоняя все, кроме SELECT. Запросы, которые должны обработать SQL из источников, которым не доверяют,
могли бы также рассмотреть понижающиеся пределы ресурса, используя
sqlite3_limit()
и ограничив размер базы данных, используя
max_page_count
PRAGMA
в дополнение к использованию авторизатора. Только единственный авторизатор может существовать на соединении с базой
данных за один раз. Каждый запрос sqlite3_set_authorizer
отвергает предыдущий запрос. Отключите авторизатор, установив отзыв NULL.
Авторизатор отключен по умолчанию. Отзыв авторизатора не должен делать ничего, что изменит соединение с базой
данных, которое вызвало авторизатор, в том числе вызывать
sqlite3_prepare_v2() и
sqlite3_step(). Когда sqlite3_prepare_v2()
используется, чтобы подготовить запрос, он
мог бы быть повторно подготовлен во время
sqlite3_step()
из-за изменения схемы. Следовательно, приложение должно гарантировать, что
правильный отзыв авторизатора остается на месте во время
sqlite3_step(). Обратите внимание на то, что отзыв авторизатора вызван только во время
sqlite3_prepare() или его вариантов.
Разрешение не выполняется во время оценки запроса в
sqlite3_step(), если, как указано в предыдущем параграфе,
sqlite3_step() не вызывает sqlite3_prepare_v2(),
чтобы повторно подготовить запрос после изменения схемы.
Choose any three.
SQLite C Interface
Отзывы разрешения времени компиляции
int sqlite3_set_authorizer(sqlite3*, int (*xAuth)(void*,int,const char*,
const char*,const char*,const char*),
void *pUserData);