Защита строк в PostgreSQL на уровне отдельных команд и ролей работает следующим образом: 12
- По умолчанию таблицы не имеют политик, и если система прав SQL разрешает пользователю доступ к таблице, все строки в ней одинаково доступны для чтения или изменения. 1
- Когда для таблицы включается защита строк (с помощью команды ALTER TABLE … ENABLE ROW LEVEL SECURITY), все обычные запросы к таблице на выборку или модификацию строк должны разрешаться политикой защиты строк. 1 Если политика для таблицы не определена, применяется политика запрета по умолчанию, так что никакие строки в этой таблице нельзя увидеть или модифицировать. 1
- Политики защиты строк могут применяться к определённым командам и/или ролям. 1 Политику можно определить как применяемую к командам ALL (всем) либо SELECT, INSERT, UPDATE и DELETE. 1 Кроме того, политику можно связать с несколькими ролями, при этом действуют обычные правила членства и наследования. 1
- Чтобы определить, какие строки будут видимыми или могут изменяться в таблице, для политики задаётся выражение, возвращающее логический результат. 1 Это выражение будет вычисляться для каждой строки перед другими условиями или функциями, поступающими из запроса пользователя. 1 Строки, для которых это выражение возвращает не true, обрабатываться не будут. 1
- Выражения политик обрабатываются в составе запроса с правами исполняющего его пользователя, но для обращения к данным, недоступным этому пользователю, в этих выражениях могут применяться функции, определяющие контекст безопасности. 1
Суперпользователи и роли с атрибутом BYPASSRLS всегда обращаются к таблице, минуя систему защиты строк. 1 На владельца таблицы защита строк тоже не действует, хотя он может включить её для себя принудительно, выполнив команду ALTER TABLE … FORCE ROW LEVEL SECURITY. 1
Неотъемлемое право включать или отключать защиту строк, а также определять политики для таблицы, имеет только её владелец. 1