Я столкнулся с проблемой при сбросе владельца таблицы всякий раз, когда для таблицы в psql создается индекс. Я делаю это программно, определяя ddl_command_start.
Последовательность событий:
- При выполнении / создании api серверная часть создает таблицу с помощью роли table_role и сбрасывает владельца на суперпользователя / администратора.
- При выполнении api / createIndex серверная часть пытается создать индекс, используя роль table_role, при этом он не может выполнить ddl_command_start, поскольку table_role не является владельцем созданной таблицы на шаге 1.
Есть ли способ предоставить временный доступ к созданной таблице в качестве владельца на втором этапе? (без выполнения явного sql из кода)
Можно ли вызвать функцию db или другие средства для сброса роли до того, как проверка разрешений произойдет в таблице?
Пожалуйста, дайте мне знать ваши комментарии. Спасибо.
permForIndexEndFunc := `CREATE OR REPLACE FUNCTION internal.trg_create_index_set_owner()
RETURNS event_trigger
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
DECLARE
obj record;
tablename text;
BEGIN
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag='CREATE INDEX' LOOP
tablename := substring(obj.object_identity from 1 for 10);
EXECUTE format('SET ROLE %s','admin');
EXECUTE format('ALTER TABLE %s OWNER TO table_role', tablename);
END LOOP;
END;
$$;`
_, err = db.Exec(permForIndexEndFunc)
if err != nil {
return err
}
permForIndexEndTrigger := `CREATE EVENT TRIGGER trg_create_index_set_owner
ON ddl_command_start
WHEN tag IN ('CREATE INDEX')
EXECUTE PROCEDURE internal.trg_create_index_set_owner();`
_, err = db.Exec(permForIndexEndTrigger)
if err != nil {
return err
}
В основном мое приложение создает общие схемы базы данных приема на основе конфигурации клиента (либо через вызовы grpc / rest api), поэтому клиент отправляет схему в форме json и создает идентичную схему базы данных в бэкэнде, затем клиент onwords отправляет данные в предопределенный формат json. Таким образом, в основном, когда схема создается на триггерах событий db, сохраняется rbac такой-то схемы, таблиц. Схема, создание таблицы происходит, принимая только роль создания путем сброса владельца на суперпользователя с использованием триггера события, поэтому время, когда владелец создания индекса таблицы был сброшен и завершился ошибкой.