PostgreSQL Alterar proprietário de todas as tabelas em um esquema específico

19

Estou tentando alterar o proprietário de todas as tabelas no mesmo esquema em uma linha de comando. isto é: alter table schema_name.* owner to newowner. Existe uma maneira de conseguir isso?

Destino Torcido
fonte

Respostas:

11

Proprietário reatribuído

Há um comando de privilégio específico que faz exatamente isso, RESASSIGN OWNED ,. Isso reatribui todos os objetos, não apenas aqueles em um esquema específico.

Esquema específico

Você pode gerar os ALTER TABLEcomandos com o seguinte,

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';

No psql, você pode executá-los seguindo-o imediatamente com \gexec

Evan Carroll
fonte
8

Não conheço nenhuma maneira de fazer isso puramente através do psql, mas usando o bash, você pode listar as tabelas no banco de dados $ DB com:

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

E a propriedade pode ser transferida para $ OWNER com:

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

Juntar isso fornece:

 $ 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 e $ OWNER representam o banco de dados, o esquema (geralmente 'público') e o nome do novo proprietário, respectivamente.

jrial
fonte
7

Se você pode consultar os nomes de tabela em seu esquema, pode gerar as consultas para alterar a propriedade da tabela.

Por exemplo:

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

retornará a consulta para alterar a propriedade de todas as tabelas:

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;
...

então você pode simplesmente executá-los :)

Ali Saeed
fonte
1

Este script fará o truque.

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

encontrado aqui https://github.com/trrao/PostgreSQL_Scripts

yatabani
fonte
0

Semelhante ao acima usando bash, mas eu tive que produzir em um arquivo de texto e depois inserir no 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

Com base nisso, mas o banco de dados foi adicionado: http://penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html

riley
fonte
0

Essa é uma função que eu uso para alterar a tabela, exibir e propriedade da função em um esquema. É rápido, limpo e um bom exemplo de como usar cursores também. Além disso, nenhuma linha de comando é necessária.

A seguir, as permissões serão alteradas por meio da função 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;
Martin Jstone
fonte