AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 24386
Accepted
wookie1
wookie1
Asked: 2012-09-17 04:25:30 +0800 CST2012-09-17 04:25:30 +0800 CST 2012-09-17 04:25:30 +0800 CST

Problema com permissões para o usuário

  • 772

Olá, estou tentando criar uma função de login (usuário) com uma capacidade mínima de modificar o banco de dados. Eles devem ser capazes de selecionar, excluir, criar gatilhos, inserir e atualizar. Eu gostaria de ter várias contas que são membros do usuário para que tenham as mesmas permissões, mas posso registrar edições para usuários individuais.

Estou usando o pgadmin para o design do meu banco de dados e meu programa acessa isso com o QtSQL.

A mensagem de erro que recebo é detectada pelo Qt ao tentar selecionar alguns dados como teste. Quando executo o mesmo código que o proprietário do banco de dados e o superusuário, não tenho problemas.

bool run_query(const QString & q){
    QSqlDatabase db = QSqlDatabase::database("default");
    QSqlQuery query(db);

    query.exec(q);

    if (!query.isActive()){
        QMessageBox::warning(0, QObject::tr("Database Error"),
                             query.lastError().text());
        return false;
    }

    while (query.next()){
        QString title = query.value(0).toString();
        std::cerr << qPrintable(title) << std::endl;
    }
    return true;
}

run_query("Select forename from contacts;");

ERRO: permissão negada para contatos de relação QPSQL: Não foi possível criar a consulta

Até agora eu criei a função (usuário).

-- Role: user

-- DROP ROLE "user";

CREATE ROLE "user" LOGIN
  ENCRYPTED PASSWORD 'md54d45974e13472b5a0be3533de4666414'
  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
COMMENT ON ROLE "user" IS 'Low level user';

Como isso deu os problemas anteriores. Tentei adicionar permissões de público para o banco de dados, mas também não funcionou.

Agora não tenho ideia de onde procurar uma solução. Qualquer ajuda é muito apreciada. Obrigado.

postgresql role
  • 2 2 respostas
  • 11121 Views

2 respostas

  • Voted
  1. Best Answer
    Craig Ringer
    2012-09-17T15:21:21+08:002012-09-17T15:21:21+08:00

    GRANTA criação ALLde permissões para público no banco de dados é redundante (como público tem conexão, temporária por padrão, então você só adicionaria CREATEo que provavelmente não deseja fazer). Você provavelmente esperava que um GRANT ALLno banco de dados resultasse em um recursivo GRANT ALLpara esquemas e tabelas contidos. GRANTnão é recursivo , então isso não acontece; a GRANT ALLem um banco de dados apenas concede direitos CONNECTao TEMPORARYbanco de dados, sem efeito nos esquemas e tabelas contidos.

    Os s padrão GRANTsão, dos documentos em GRANT :

    O PostgreSQL concede privilégios padrão em alguns tipos de objetos para PUBLIC. Nenhum privilégio é concedido a PUBLIC por padrão em tabelas, colunas, esquemas ou tablespaces. Para outros tipos, os privilégios padrão concedidos a PUBLIC são os seguintes: CONNECT e CREATE TEMP TABLE para bancos de dados; privilégio EXECUTE para funções; e privilégio USAGE para idiomas. O proprietário do objeto pode, é claro, REVOGAR os privilégios padrão e expressamente concedidos. (Para segurança máxima, emita o REVOKE na mesma transação que cria o objeto; então não há nenhuma janela na qual outro usuário possa usar o objeto.) Além disso, essas configurações de privilégio padrão iniciais podem ser alteradas usando o comando ALTER DEFAULT PRIVILEGES.

    Então você pode ver que não precisa de GRANTnada no banco de dados, a menos que queira que o usuário possa criar esquemas, etc. Você precisa:

    • GRANT USAGE ON SCHEMA myschema TO theuser;para qualquer esquema diferente de public. CREATEpode ser concedida se você quiser que o usuário seja capaz de criar tabelas, visualizações, etc.
    • GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sometable TO theuser;para tabelas. Eu omiti os direitos TRUNATE, REFERENCESe TRIGGERporque você provavelmente não deseja concedê-los.
    • GRANT USAGE ON SEQUENCE sometable_somecolumn_seq TO theuser;para quaisquer sequências usadas nos padrões da tabela, explicitamente ou por meio de uma coluna SERIALou .BIGSERIAL

    ... etc. Veja o manual do GRANTlink acima para definições completas do que os privilégios fazem, quais estão disponíveis em quais objetos, etc. Tome nota do curinga ALL TABLESe das ALL SEQUENCESopções.

    Se isso parecer muito trabalhoso para cada tabela, exibição, esquema, sequência etc., você pode usar a página 9.1 e superior ALTER DEFAULT PRIVILEGESpara alterar os s padrão GRANTem novos objetos.

    • O manual paraGRANT
    • O manual paraALTER DEFAULT PRIVILEGES
    • 9
  2. kgrittn
    2012-09-17T11:34:25+08:002012-09-17T11:34:25+08:00

    Parece que você precisa de algo assim:

    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE contacts TO "user";
    

    A propósito, espero que "user"não seja um nome de usuário real que você escolheu. Ele não apenas falha em transmitir muito sobre a semântica da função, mas você precisará citá-lo em todos os lugares, o que pode ser um incômodo e causar confusão quando houver um problema. Se você escolher um nome para a função que não seja uma palavra-chave e indique para que serve a função, provavelmente ficará mais satisfeito com os resultados.

    Não tenho certeza se trazer a camada QtSQL para a questão ajuda alguém a entender o problema. Se você puder mostrar o problema em uma sessão, psqlpoderá atrair mais respostas.

    • 6

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve