Измените владельца всех таблиц с помощью функции PostgreSQL

#sql #postgresql #function

Вопрос:

Я хочу сменить владельца для всех таблиц в определенном table_catalog с функцией:

 CREATE OR REPLACE function change_owner_table_catalog(catalog_arg varchar, owner_arg varchar)
    RETURNS void AS $
    DECLARE
    table_name_value varchar;
    sequence_name_value varchar;
    BEGIN
        for table_name_value in (SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_catalog = catalog_arg) loop
            ALTER TABLE table_name_value OWNER TO owner_arg;
        end loop;
    END;
    $ language plpgsql;
 

Я выполняю его:

 select change_owner_table_catalog('cinema', 'cinema_user')
 

И есть следующая ошибка:

ОШИБКА: отношение «значение имя_таблицы» не существует КОНТЕКСТ: инструкция SQL «ИЗМЕНИТЬ ВЛАДЕЛЬЦА имени имя_таблицы ТАБЛИЦЫ НА имя владельца» PL/pgSQL функция change_owner_table_catalog(изменение символов,изменение символов) строка 7 в инструкции SQL Состояние SQL: 42P01

Ответ №1:

Вам нужен динамический SQL, так ALTER TABLE как он не поддерживает параметры:

 EXECUTE format('ALTER TABLE public.%I OWNER TO %I', table_name_value, owner_arg);