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.
GRANT
A criaçãoALL
de 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ó adicionariaCREATE
o que provavelmente não deseja fazer). Você provavelmente esperava que umGRANT ALL
no banco de dados resultasse em um recursivoGRANT ALL
para esquemas e tabelas contidos.GRANT
não é recursivo , então isso não acontece; aGRANT ALL
em um banco de dados apenas concede direitosCONNECT
aoTEMPORARY
banco de dados, sem efeito nos esquemas e tabelas contidos.Os s padrão
GRANT
são, dos documentos em GRANT :Então você pode ver que não precisa de
GRANT
nada 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 depublic
.CREATE
pode 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 direitosTRUNATE
,REFERENCES
eTRIGGER
porque 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 colunaSERIAL
ou .BIGSERIAL
... etc. Veja o manual do
GRANT
link acima para definições completas do que os privilégios fazem, quais estão disponíveis em quais objetos, etc. Tome nota do curingaALL TABLES
e dasALL SEQUENCES
opçõ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 PRIVILEGES
para alterar os s padrãoGRANT
em novos objetos.GRANT
ALTER DEFAULT PRIVILEGES
Parece que você precisa de algo assim:
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,
psql
poderá atrair mais respostas.