PostgreSQL Смена владельца всех таблиц по определенной схеме

19

Я пытаюсь изменить владельца всех таблиц по одной и той же схеме в одной командной строке. то есть: alter table schema_name.* owner to newowner. Есть ли способ сделать это?

Искаженная Судьба
источник

Ответы:

11

Переназначенный

Для этого есть специальная команда привилегий RESASSIGN OWNED. Это переназначает все объекты, а не только объекты в определенной схеме.

Схема конкретных

Вы можете генерировать ALTER TABLEкоманды с помощью следующего,

SELECT format(
  'ALTER TABLE %I.%I.%I OWNER TO %I;',
  table_catalog,
  table_schema,
  table_name,
  current_user  -- or another just put it in quotes
)
FROM information_schema.tables
WHERE table_schema = 'mySchema';

В psql вы можете запустить их, выполнив сразу же \gexec

Эван Кэрролл
источник
8

Я не знаю ни одного способа сделать это чисто через psql, но используя bash, вы можете перечислить таблицы в базе данных $ DB с помощью:

psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}

А право собственности может быть передано $ OWNER с помощью:

psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}

Соединяя это вместе, вы получите:

 $ for table in `psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}` ; do  psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB} ; done

$ DB, $ SCHEMA и $ OWNER представляют базу данных, схему (обычно 'public') и имя нового владельца соответственно.

jrial
источник
7

Если вы можете запросить имена таблиц в своей схеме, вы можете сгенерировать запросы на владение таблицей ALTER.

Например:

 select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;' 
 from  pg_tables t
 where t.tableowner != 'rdsadmin';

вернет запрос на изменение владельца всех таблиц:

ALTER TABLE schema_version OWNER TO ali;
ALTER TABLE users OWNER TO ali; 
ALTER TABLE company OWNER TO ali;
ALTER TABLE books OWNER TO ali;
...

тогда вы можете просто запустить эти :)

Али Саид
источник
1

Этот скрипт сделает свое дело.

sh change_owner.sh -n new_owner -S schema_name

sh change_owner.sh -n user1 -S public

Summary:
    Tables/Sequences/Views : 16
    Functions              : 43
    Aggregates             : 1
    Type                   : 2

находится здесь https://github.com/trrao/PostgreSQL_Scripts

yatabani
источник
0

Как и выше, используя bash, но мне пришлось вывести текстовый файл, а затем ввести в psql:

$ psql -qAt -d mydatabase -c "SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' \
                                      OWNER TO new_owner;' \
                                      FROM pg_tables \
                                      WHERE schemaname = 'myschema'" > data.txt


$ psql < data.txt -d mydatabase

На основании этого, но база данных добавлена: http://penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html

Райли
источник
0

Эту функцию я использую для изменения владельца таблицы, представления и функции в схеме. Это быстрый, чистый и хороший пример того, как использовать курсоры. Кроме того, не требуется командной строки.

Следующее изменит разрешения через функцию plpgsql:

CREATE OR REPLACE FUNCTION YOURSCHEMA.do_changeowner(
    newowner text,
    pschem text)
  RETURNS void AS
$BODY$
declare
  tblnames CURSOR FOR
    SELECT tablename FROM pg_tables
    WHERE schemaname = pschem;
  viewnames CURSOR FOR
    SELECT viewname FROM pg_views
    WHERE schemaname = pschem;
  funcnames CURSOR FOR
    SELECT p.proname AS name, pg_catalog.pg_get_function_identity_arguments(p.oid) as params
    FROM pg_proc p 
    JOIN pg_namespace n ON n.oid = p.pronamespace 
    WHERE n.nspname = pschem;

begin

  FOR stmt IN tblnames LOOP
    EXECUTE 'alter TABLE ' || pschem || '.' || stmt.tablename || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN viewnames LOOP
    EXECUTE 'alter VIEW ' || pschem || '.' || stmt.viewname || ' owner to ' || newowner || ';';
  END LOOP;
  FOR stmt IN funcnames LOOP
    EXECUTE 'alter FUNCTION ' || pschem || '.' || stmt.name || '(' ||  stmt.params || ') owner to ' || newowner || ';';
  END LOOP;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Мартин Джстоун
источник