У меня есть игра, над которой я работаю, с Postgres в качестве бэкэнда. Одна из особенностей, с которыми я боролся, - это способ позволить игрокам писать сценарии определенных аспектов игрового процесса. Эти сценарии будут храниться в таблице (текстовом столбце), и в конце каждого хода сценарии будут выполняться с помощью хранимой процедуры.
Я могу выбрать код сценария из этой таблицы и запустить его с помощью оператор что-то вроде этого:
do [script-code-here] language whatever-pl-language;
--haven't decided which languages to allow, might give them choice of several
Хранимая процедура, которая запускает их, будет запускать код с соответствующей ролью postgres, заблокированной с достаточным количеством разрешений, чтобы они могли влиять только на таблицы (и столбцы), которые они должны быть в состоянии повлиять. Но, конечно же, данные других игроков будут в тех же таблицах, поэтому мне нужна защита на уровне строк, чтобы они могли обновлять / удалять / вставлять свои собственные строки, не имея возможности обманывать и изменять строки оппонентов.
Примеры create policy
в документации Postgres немногочисленны. Мне не удалось найти предложение USING, которое не выполняет простую проверку x = current_user (с ролью, под которой запускается код: current_user).
Если в таблице скриптов есть столбец player_id и во всех других таблицах скрипты могут быть затронуты, есть ли способ сформулировать оператор create policy
, который не заставляет меня создавать новую роль postgres для каждого игрока (из которых может быть произвольно большое число)? Блок анонимного кода может (например) установить некоторую переменную в player_id выполняемого скрипта, за исключением того, что оператор set
может устанавливать пользовательские параметры или переменные. Также я не могу найти неважное, которое можно изменить и установить на это значение (даже не похоже, что на него можно ссылаться в pl sql).
Есть ли какая-то особенность или трюк, которые позволили бы мне сформулировать create policy
утверждения, используя таблицы / столбцы, которые я описал, без создания новых ролей для каждого игрока? * Расширения Postgres приветствуются.