Передайте владелец пакета представлений и таблиц от суперпользователя postgres другому пользователю, используя psql в скрипте - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу изменить владельца базы данных с postgres другому пользователю, используя скрипт bash.

Я нашел ссылку в stackoverflow следующей командой:

# Change owner of tables and views.
for tbl in $(pgexec "SELECT table_name FROM information_schema.tables WHERE table_schema='$schema';" $database) \
           $(pgexec "SELECT table_name FROM information_schema.views WHERE table_schema='$schema';" $database)
do
        pgexec "ALTER TABLE \"$schema\".\"$tbl\" OWNER TO $role;" $database 
    done

Iвызовите команду, используя следующую функцию:

function  pgexec() {
        local cmd=$1
        local database=$2 
        sudo -u postgres psql -d $database --record-separator=\0 -c $cmd 

Я получаю следующую ошибку:

 relation public.table_name doesn't exist

pgexec Я протестировал несколько других запросов SQL и работает.

1 Ответ

0 голосов
/ 26 сентября 2018

Во-первых, таблицы и представлений перечислены в information_schema.tables, поэтому вы будете изменять представления дважды , так как вы также запрашиваете information_schema.views

Вы можетелегко достичь этого в SQL без помощи оболочки (кроме как для ее выполнения).Примерно так:

/* Create a function as you would likely reuse this action */
CREATE OR REPLACE FUNCTION public.set_owner (in_schema TEXT, in_role TEXT)
RETURNS VOID
AS $$

DECLARE object_name TEXT;

BEGIN

    FOR object_name IN (
        SELECT
            table_schema || '.' || table_name AS object_name
        FROM
            information_schema.tables
        WHERE
            schema = in_schema
        )
    LOOP
        EXECUTE FORMAT('ALTER TABLE %s OWNER TO %s', object_name, in_role);
    END LOOP;

END;
$$ LANGUAGE PLPGSQL VOLATILE;

Назовите это как SELECT public.set_owner('public', 'tbl_owner');

...