Изменение владельца объектов БД
Аннотация
В инструкции приведена краткая последовательность действий по изменению владельца объектов базы данных (далее - БД) с одной ролевой группы на другую.
Изменение владельца объектов БД
Изменение владельца объектов БД с сервисной учетной записи на ролевую группу «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