Hallo, ich versuche, eine Anmelderolle (Benutzer) mit einer relativ geringen Fähigkeit zum Ändern der Datenbank zu erstellen. Sie sollten in der Lage sein, Trigger auszuwählen, zu löschen, zu erstellen, einzufügen und zu aktualisieren. Ich möchte dann mehrere Konten haben, die Mitglieder des Benutzers sind, damit sie die gleichen Berechtigungen haben, aber ich kann Änderungen für einzelne Benutzer protokollieren.
Ich verwende pgadmin für mein Datenbankdesign und mein Programm greift mit QtSQL darauf zu.
Die Fehlermeldung, die ich erhalte, wird von Qt abgefangen, wenn versucht wird, einige Daten als Test auszuwählen. Wenn ich denselben Code wie der Datenbankbesitzer und der Superuser ausführe, habe ich keine Probleme.
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;");
FEHLER: Berechtigung für Beziehungskontakte verweigert QPSQL: Abfrage kann nicht erstellt werden
Bisher habe ich die Rolle (Benutzer) erstellt.
-- 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';
Da dies die vorherigen Probleme gab. Ich habe versucht, öffentliche Berechtigungen für die Datenbank hinzuzufügen, aber dies hat auch nicht funktioniert.
Jetzt habe ich keine Ahnung, wo ich nach einer Lösung suchen soll. Jede Hilfe wird sehr geschätzt. Vielen Dank.
quelle
public
auf die Datenbank redundant (wiepublic
hatconnect, temporary
standardmäßig) und wird nicht zu einem rekursiven Zuschuss Schemata oder Tabellen in diesen Schemata. Siehe postgresql.org/docs/current/static/sql-grant.html und postgresql.org/docs/current/static/…Antworten:
GRANT
DieALL
Berechtigung der Öffentlichkeit für die Datenbank ist größtenteils redundant (da die Öffentlichkeit eine Verbindung hat, die standardmäßig temporär ist, würden Sie nur das hinzufügen,CREATE
was Sie wahrscheinlich nicht möchten). Sie haben wahrscheinlich erwartetGRANT ALL
, dass ein EintragGRANT ALL
in der Datenbank zu einer Rekursion in enthaltene Schemas und Tabellen führt.GRANT
ist nicht rekursiv , also passiert dies nicht; aGRANT ALL
in einer Datenbank gewährt der Datenbank nur RechteCONNECT
undTEMPORARY
Rechte, ohne Auswirkungen auf enthaltene Schemas und Tabellen.Die Standardeinstellungen
GRANT
sind aus den Dokumenten zu GRANT :Sie können also sehen, dass Sie
GRANT
nichts in der Datenbank benötigen, es sei denn, Sie möchten, dass der Benutzer Schemas usw. erstellen kann. Sie müssen:GRANT USAGE ON SCHEMA myschema TO theuser;
für jedes andere Schema alspublic
.CREATE
kann gewährt werden, wenn der Benutzer Tabellen, Ansichten usw. erstellen kann.GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sometable TO theuser;
für Tabellen. Ich habe das und die Rechte weggelassenTRUNATE
, da Sie sie wahrscheinlich nicht gewähren möchten.REFERENCES
TRIGGER
GRANT USAGE ON SEQUENCE sometable_somecolumn_seq TO theuser;
für alle Sequenzen, die in Tabellenstandards verwendet werden, entweder explizit oder über eineSERIAL
oder-BIGSERIAL
Spalte.... usw. Im
GRANT
oben verlinkten Handbuch finden Sie vollständige Definitionen der Berechtigungen, die für welche Objekte verfügbar sind usw. Beachten Sie den PlatzhalterALL TABLES
und dieALL SEQUENCES
Optionen.Wenn dies für jede Tabelle, Ansicht, jedes Schema, jede Sequenz usw. zu aufwändig erscheint, können Sie in Seite 9.1 und höher
ALTER DEFAULT PRIVILEGES
die StandardeinstellungenGRANT
für neue Objekte ändern .GRANT
ALTER DEFAULT PRIVILEGES
quelle
Es sieht so aus, als ob Sie so etwas brauchen:
Ich hoffe übrigens, dass
"user"
es sich nicht um einen tatsächlichen Benutzernamen handelt, den Sie gewählt haben. Es vermittelt nicht nur nicht viel über die Semantik der Rolle, sondern Sie müssen sie auch überall zitieren, was etwas störend sein und bei Problemen zu Verwirrung führen kann. Wenn Sie einen Namen für die Rolle auswählen, der kein Schlüsselwort ist und angibt, wofür die Rolle bestimmt ist, sind Sie wahrscheinlich mit den Ergebnissen zufriedener.Ich bin mir nicht sicher, ob das Einbeziehen der QtSQL-Schicht in die Frage jemandem hilft, das Problem zu verstehen. Wenn Sie das Problem in einer Sitzung in
psql
anzeigen können, erhalten Sie möglicherweise mehr Antworten.quelle