3
Политика защиты строк
Определяет видимость и изменяемость строк таблицы
предикат вычисляется для каждой строки с правами вызывающего
клиенту доступны только те строки, для которых предикат истинен
Предикат для существующих строк (USING)
используется операторами SELECT, UPDATE, DELETE
при нарушении политики не возникает ошибка
(если только не сброшен параметр row_security)
Предикат для новых строк (WITH CHECK)
используется операторами INSERT, UPDATE
если не задан, используется первый предикат
при нарушении политики возникает ошибка
Политики защиты строк (row-level security, RLS) позволяют управлять
доступом к таблице на уровне отдельных строк. Другое название этого
инструмента — Fine Grained Access Control.
Политики являются дополнительным механизмом: роль по-прежнему
должна иметь доступ к таблице, предоставленный привилегиями.
Политика определяет возможность выборки или изменения строк
таблицы с помощью двух предикатов (логических выражений), которые
вычисляются для каждой строки запроса. Результаты говорят о том,
может ли пользователь видеть или менять строку.
Первый предикат вычисляется для существующих строк и
используется операторами SELECT, UPDATE, DELETE. Если для какой-
то строки предикат не принимает истинное значение (то есть дает ложь
или NULL), строка не попадает в итоговую выборку. Упрощенно можно
считать, что предикат просто «дописывается» к условию WHERE —
хотя на самом деле все значительно сложнее.
Если установлено row_security = off, при ложном значении предиката
хотя бы для одной строки будет зафиксирована ошибка. Это полезно
при изготовлении логической резервной копии, чтобы гарантировать,
что в нее попали все строки всех таблиц.
Второй предикат определяет видимость новых строк. Он проверяется
командами INSERT и UPDATE; при нарушении политики возникает
ошибка.