Filter
Членство
TABLE
Синтаксис
PROPERTY Filter: STRING[];
Описание
Свойство позволяет получить или назначить значение фильтра данной таблицы БД.
Значение должно соответствовать текстовому описанию
фильтра, пустая строка означает "нет фильтра".
Если при доступе по записи Filter задан в неправильном формате,
выбрасывается исключение 398. Установленное
значение файлового фильтра
хранится до следующего его переназначения или до окончания сеанса и действует
только в пределах собственного подключения. При назначении нового фильтра,
сбрасываются позиции курсоров, которые этот фильтр маскирует. Процедура установки файлового фильтра -
нетранзакционная. Новое
значение файлового фильтра начинает действовать сразу после его успешного
назначения. Это означает, что уже следующий запрос будет выполняться с учетом нового значения
файлового фильтра.
Свойство добавлено в версии 14.129.040.
Файловый фильтр - это фильтр доступа данного подключения к записям указанной
таблицы БД, а также ко всем ее транзитивным USER- и BORROW-файлам, в которых
установлен режим
TransitiveFiltersAreActive. Файловые
фильтры работают по аналогии с фильтрами зон видео-окон (см.
FORM_ZONE.PermanentFilter,
FORM_ZONE.UserFilter),
но отрабатываются сервером, и
действуют при выполнении любых серверных запросов.
Следовательно их действие распространяется не только
на видеосистему, но и на работу ASL-программ. При
наличии файлового фильтра сервер скрывает от клиента записи таблицы БД, не удовлетворяющие этому фильтру, и не
позволяет клиенту выполнить модификации записей,
противоречащие фильтру. Имеется два режима сокрытия данных: маскирование и
выбрасывание исключения. Выбор режима управляется атрибутом
TABLE_FILTER_MODE
TRY-блока.
Вот перечень серверных запросов, которые учитывают файловые фильтры:
- "Поиск записи". Через него работают ASL-процедуры
SEARCH, SRCINSEL, SELECT,
NEXT, PREV,
FIRST, LAST, CONFORM, HISTCONF
и т.п. В режиме TABLE_FILTER_MODE_ON эти запросы просто не замечает записей, неудовлетворяющих фильтру. В
этом случае SEARCH вернет 0 (не нашел),
NEXT пропустит неудовлетворяющие фильтру записи и
т.п. В режиме TABLE_FILTER_MODE_THROW эти процедуры выбрасывают
исключение 790.
- "Построение списка записей для отображения их в зоне видео-окна".
С его помощью видео-система отображает записи в зонах видео-окон.
Здесь фильтр всегда работает в режиме TABLE_FILTER_MODE_ON. Одновременно учитываются и файловые фильтры,
и фильтр, наложенный
на видео-зону - они объединяются по И.
- Группа запросов
Для процедур, работающих для единственной записи таблицы-лидера, т.е. без
суффикса SEL,
- проверяется, что исходная запись удовлетворяет
файловому фильтру. Если это не так, сервер возвращает ошибку, а соответствующие
ASL-процедуры выбрасывают исключение 396.
- при включенном контроле целостности БД проверяется, что
исходная запись ссылается на справочные записи,
удовлетворяющие файловым фильтрам. Если это не так, эти процедуры
выбрасывают исключение 218
Для процедур, работающих для всех записей таблицы-лидера из текущего селекта,
т.е. с суффиксом SEL, запросы выполняются только
для записей, удовлетворяющих файловому фильтру.
Если в режиме TABLE_FILTER_MODE_THROW обнаруживается запись,
неудовлетворяющая файловому фильтру, выбрасывается
исключение 970. В параметрах этих процедур
может быть указан дополнительный фильтр, действующий только на данный
запрос. Он всегда работает в режиме TABLE_FILTER_MODE_ON, причем проверяется
он раньше файлового. Это означает, что если запись маскируется запросным
фильтром, то запрос не прервется, если та же запись не удовлетворяет
файловому фильтру в режиме TABLE_FILTER_MODE_THROW.
- "Вставка новой записи". Через него работают ASL-процедура
INSERT, интерактивная
вставка. Если вставляемая запись не удовлетворяет файловому фильтру,
серверный запрос возвращает ошибку, на которую ASL-процедура INSERT
выбрасывает исключение 397. Если вставляемая
запись ссылается на справочную запись, не удовлетворяющую файловому фильтру,
то при включенном контроле целостности БД выбрасывается
исключение 217.
- "Модификация записи". Через него работают
ASL-процедура REPLACE,
интерактивное редактирование. На соответствие файловому фильтру сервер проверяет и исходное и новое значения записи. Если фильтру не удовлетворяет исходное
значение, ASL-процедура REPLACE выбрасывает исключение 396, если новое -
исключение
397. При включенном контроле целостности БД и для исходного и
для нового экземпляра записи проверяется, что они ссылаются на справочные
записи, удовлетворяющие фильтрам. Если фильтру не удовлетворяет справочная
запись исходного экземпляра, выбрасывается
исключение 218, если нового - исключение 217.
- Запрос для ASL-процедур ADD, REP,
CONCURRENTADD,
CONCURRENTADDONLY, CONCURRENTRESET. Основная их особенность: они не делают вид, как SEARCH, что если указанная запись не удовлетворяет фильтру, то такой записи нет, а наоборот, как REPLACE, возвращают
в этом случае соответствующие ошибки.
- Сервер сначала выполняет поиск указанной записи. Если нашел и запись не соответствует файловому фильтру, то сервер возвращает ошибку, а ASL-процедуры выбрасывают
исключение 396.
- Формируется новое значение записи. Если это новое значение не удовлетворяет файловому фильтру, то сервер возвращает ошибку, а ASL-процедуры выбрасывают исключение 397.
При включенном контроле целостности БД и для исходного и
для нового экземпляра записи проверяется, что они ссылаются на справочные
записи, удовлетворяющие фильтрам. Если фильтру не удовлетворяет справочная
запись исходного экземпляра, выбрасывается
исключение 218, если нового - исключение 217.
Запрос "количество записей в таблице", через который работает,
например, ASL-процедура AMOUNT, не учитывает файловый фильтр, поэтому, по большому счету, работает неправильно.
Наложенный файловый фильтр скрывает записи только от пользователя.
Контроль целостности (уникальность, ссылочная целостность и т.п.) работает в полном объеме. Без учета фильтра работают и групповые операции, связанные с
контролем целостности, - удаление связанных записей в BORROW-файлах при выполнении REMOVE, модификация связанных записей в USER- и BORROW-файлах при выполнении REPLACE
и т.п. Т.е. получается, что если на файл Lend наложен
некий файловый фильтр LendFilter, а на его
BORROW-файл Borrow наложен
файловый фильтр BorrowFilter, то при выполнении
REMSEL(Lend) при включенном
контроле целостности будет учитываться файловый фильтр файла
Lend, но не будет учитываться файловый фильтр файла
Borrow.