Аннотация

В инструкции приведена краткая последовательность действий по изменению владельца объектов базы данных (далее - БД) с одной ролевой группы на другую. 

Изменение владельца объектов БД

Изменение владельца объектов БД с сервисной учетной записи на ролевую группу «as_admin» может привести к нарушению работы Termidesk в случае некорректной настройки прав доступа.

Перед применением изменений в производственной среде рекомендуется предварительно выполнить процесс изменения владельца в тестовой среде.

Для безопасной смены владельца объектов БД на ролевую группу «as_admin» нужно:

  • запустить терминальный клиент СУБД PostgreSQL от имени пользователя postgres:
sudo -u postgres psql
  • если работа выполняется внутри клиента psql, подключиться от имени сервисной учетной записи:
postgres=# \c termidesk

где:

termidesk - имя сервисной учетной записи;

  •  проверить текущего владельца (символ «;» в конце строки при работе с интерактивным интерфейсом обязателен):
SELECT tablename, tableowner FROM pg_tables WHERE schemaname = 'public';
  • убедиться, что ролевой группе «as_admin» назначены права:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO as_admin;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO as_admin;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO as_admin;
  • проверить, использует ли Termidesk сервисную учетную запись для соединений:
SELECT usename FROM pg_stat_activity;
  • при использовании сервисной учетной записи для соединений, убедиться, что она включена в группу «as_admin»:
ALTER ROLE termidesk INHERIT FROM as_admin;

где:

termidesk - имя сервисной учетной записи;

  • изменить владельца на ролевую группу «as_admin»:
DO $$ 
   DECLARE 
       r RECORD;
   BEGIN
       FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public') LOOP
           EXECUTE 'ALTER TABLE ' || quote_ident(r.tablename) || ' OWNER TO as_admin;';
       END LOOP;
   END $$;
  • изменить владельца всех последовательностей (используемых для автоинкрементных полей «SERIAL» и «BIGSERIAL»):
DO $$ 
   DECLARE 
       r RECORD;
   BEGIN
       FOR r IN (SELECT sequencename FROM pg_sequences WHERE schemaname = 'public') LOOP
           EXECUTE 'ALTER SEQUENCE ' || quote_ident(r.sequencename) || ' OWNER TO as_admin;';
       END LOOP;
   END $$;
  • изменить владельца всех функций (при наличии функций, процедур и триггеров):
DO $$ 
   DECLARE 
       r RECORD;
   BEGIN
       FOR r IN (SELECT routine_name FROM information_schema.routines WHERE routine_schema = 'public') LOOP
           EXECUTE 'ALTER FUNCTION ' || quote_ident(r.routine_name) || ' OWNER TO as_admin;';
       END LOOP;
   END $$;
  • изменить владельца всех представлений:
DO $$ 
   DECLARE 
       r RECORD;
   BEGIN
       FOR r IN (SELECT table_name FROM information_schema.views WHERE table_schema = 'public') LOOP
           EXECUTE 'ALTER VIEW ' || quote_ident(r.table_name) || ' OWNER TO as_admin;';
       END LOOP;
   END $$;
  • выйти из интерактивного интерфейса терминального клиента СУБД PostgreSQL:

postgres=# \q
  • выйти из сеанса пользователя postgres:
exit
  • перезапустить службу termidesk-vdi:
sudo systemctl restart termidesk-vdi.service
  • проверить состояние службы termidesk-vdi:
systemctl status termidesk-vdi.service