Nota: Como @trygvis menciona na resposta abaixo , o REASSIGN OWNED
comando está disponível desde pelo menos a versão 8.2 e é um método muito mais fácil.
Como você está alterando a propriedade de todas as tabelas, provavelmente também deseja visualizações e sequências. Aqui está o que eu fiz:
Tabelas:
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" YOUR_DB` ; do psql -c "alter table \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Sequências:
for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" YOUR_DB` ; do psql -c "alter sequence \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Visualizações:
for tbl in `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" YOUR_DB` ; do psql -c "alter view \"$tbl\" owner to NEW_OWNER" YOUR_DB ; done
Você provavelmente poderia secar um pouco, pois as instruções alter são idênticas para os três.
REASSIGN OWNED BY old_role [, ...] TO new_role
Você pode usar o
REASSIGN OWNED
comandoSinopse:
Isso altera todos os objetos pertencentes a
old_role
para a nova função. Você não precisa pensar em que tipo de objetos o usuário possui, todos eles serão alterados. Observe que isso se aplica apenas a objetos dentro de um único banco de dados. Também não altera o proprietário do próprio banco de dados.Está disponível de volta a pelo menos 8.2. Sua documentação on-line remonta apenas a esse ponto.
fonte
ERROR: unexpected classid 3079
. Acho que atualmente não funciona se houver extensões.Esta: http://archives.postgresql.org/pgsql-bugs/2007-10/msg00234.php também é uma solução agradável e rápida e funciona para vários esquemas em um banco de dados:
Tabelas
Sequências
Visualizações
Visualizações materializadas
Com base nesta resposta
Isso gera todas as instruções /
ALTER TABLE
/ necessárias , copie-as e cole-as novamente no plsql para executá-las.ALTER SEQUENCE
ALTER VIEW
Verifique seu trabalho no psql fazendo:
fonte
Se você quiser fazer isso em uma instrução sql, precisará definir uma função exec () conforme mencionado em http://wiki.postgresql.org/wiki/Dynamic_DDL
Então você pode executar esta consulta, ela mudará o proprietário de tabelas, sequências e visualizações:
$ NEWUSER é o novo nome do novo proprietário do postgresql.
Na maioria das circunstâncias, você precisa ser superusuário para executar isso. Você pode evitar que, alterando o proprietário de seu próprio usuário para um grupo de funções do qual você seja membro.
Agradecemos ao RhodiumToad no #postgresql por ajudar com isso.
fonte
Recentemente, tive que alterar a propriedade de todos os objetos em um banco de dados. Embora tabelas, visualizações, gatilhos e seqüências tenham sido alterados com alguma facilidade, a abordagem acima falhou para as funções, pois a assinatura faz parte do nome da função. Concedido, eu tenho um histórico no MySQL e não estou familiarizado com o Postgres.
No entanto, pg_dump permite despejar apenas o esquema e isso contém o ALTER xxx OWNER TO yyy; declarações que você precisa. Aqui está o meu pouco de magia shell sobre o tema
fonte
grep
comando Eu sou novo no Linux, mas, pelo que entendi, parece quesed
é muito bom de usar, especialmente porque você está especificando uma correspondência que não diferencia maiúsculas de minúsculas.muito simples, experimente ...
fonte
é muito simples
feito.
fonte
Eu gosto deste, pois modifica tabelas , visualizações , sequências e funções proprietárias de um determinado esquema de uma só vez (em uma instrução sql), sem criar uma função e você pode usá-lo diretamente no PgAdmin III e no psql :
(Testado no PostgreSql v9.2)
Com base nas respostas fornecidas por @rkj, @AlannaRose, @SharoonThomas, @ user3560574 e esta resposta por @a_horse_with_no_name
Muito obrigado.
Melhor ainda: altere também o proprietário do banco de dados e do esquema .
fonte
information_schema.sequences
está vazio, apesar deSELECT c.* FROM pg_class c WHERE c.relkind = 'S';
listar sequências. Por que eles não combinam?ALTER
consulta não deveria ser umaALTER SEQUENCE
?Eu tive que mudar a propriedade das tabelas, visualizações e seqüências e achei que a ótima solução postada por @rjk está funcionando bem - apesar de um detalhe: se os nomes dos objetos forem de letras maiúsculas e minúsculas (por exemplo, "TableName"), isso falhará com " erro não encontrado.
Para contornar isso, envolva os nomes dos objetos com '"' assim:
Tabelas
Sequências
Visualizações
fonte
Você pode tentar o seguinte no PostgreSQL 9
fonte
Não existe esse comando no PostgreSQL. Mas você pode contornar isso usando o método que descrevi há algum tempo para GRANTs.
fonte
Com base na resposta de elysch , aqui está uma solução para vários esquemas:
fonte
A resposta de @Alex Soto é a correta e a essência enviada por @Yoav Aner também funciona, desde que não haja caracteres especiais nos nomes de tabela / exibição (que são legais no postgres).
Você precisa evitá-los para o trabalho e eu carreguei uma essência para isso: https://gist.github.com/2911117
fonte
Em seguida, envie o arquivo de backup novamente para o PostgreSQL usando:
Como não há proprietário incluído, todas as tabelas, esquemas etc. criados são criados no usuário de login especificado.
Eu li que isso poderia ser uma boa abordagem para a migração entre as versões do PostgreSQL também.
fonte
Eu criei um script conveniente para isso; pg_change_db_owner.sh . Esse script altera a propriedade de todas as tabelas, visualizações, sequências e funções em um esquema de banco de dados e também o proprietário do próprio esquema.
Observe que, se você quiser apenas alterar a propriedade de todos os objetos, em um banco de dados específico, pertencentes a uma função de banco de dados específica, basta usar o comando
REASSIGN OWNED
.fonte
A partir do PostgreSQL 9.0, você tem a capacidade de
GRANT [priv name] ON ALL [object type] IN SCHEMA
onde[priv name]
está o típicoSELECT, INSERT, UPDATE, DELETE, etc
e[object type]
pode ser um dos seguintes:TABLES
SEQUENCES
FUNCTIONS
Os documentos do PostgreSQL estão disponíveis
GRANT
eREVOKE
entram em mais detalhes sobre isso. Em algumas situações, ainda é necessário usar truques envolvendo os catálogos do sistema (pg_catalog.pg_*
), mas isso não é tão comum. Eu frequentemente faço o seguinte:BEGIN
uma transação para modificar os privsDATABASES
para uma "função DBA"SCHEMAS
para a "função DBA"REVOKE ALL
privs em todosTABLES
,SEQUENCES
eFUNCTIONS
de todas as funçõesGRANT SELECT, INSERT, UPDATE, DELETE
em tabelas relevantes / apropriadas para as funções apropriadasCOMMIT
a transação DCL.fonte
A solução aceita não cuida da propriedade da função. A seguinte solução cuida de tudo (ao revisar, observei que é semelhante ao @magiconair acima)
fonte
O seguinte script shell mais simples funcionou para mim.
Onde entrada $ 1 - nome de usuário (banco de dados) $ 2 = esquema existente $ 3 = para o novo esquema.
fonte
Igual à abordagem de @ AlexSoto para funções:
fonte
Docker: modificar proprietário de todas as tabelas + seqüências
fonte