Ich bin neu bei postgres (und insgesamt bei Datenbankinformationssystemen). Ich habe folgendes SQL-Skript in meiner Datenbank ausgeführt:
create table cities (
id serial primary key,
name text not null
);
create table reports (
id serial primary key,
cityid integer not null references cities(id),
reportdate date not null,
reporttext text not null
);
create user www with password 'www';
grant select on cities to www;
grant insert on cities to www;
grant delete on cities to www;
grant select on reports to www;
grant insert on reports to www;
grant delete on reports to www;
grant select on cities_id_seq to www;
grant insert on cities_id_seq to www;
grant delete on cities_id_seq to www;
grant select on reports_id_seq to www;
grant insert on reports_id_seq to www;
grant delete on reports_id_seq to www;
Wenn der Benutzer www versucht:
insert into cities (name) values ('London');
Ich erhalte folgende Fehlermeldung:
ERROR: permission denied for sequence cities_id_seq
Ich verstehe, dass das Problem beim seriellen Typ liegt. Aus diesem Grund erteile ich www Auswahl-, Einfüge- und Löschrechte für die * _id_seq. Dies behebt jedoch nicht mein Problem. Was vermisse ich?
sql
postgresql
permissions
auto-increment
Vampnik
quelle
quelle
Antworten:
Seit PostgreSQL 8.2 müssen Sie Folgendes verwenden:
GRANT USAGE - Für Sequenzen ermöglicht dieses Privileg die Verwendung der Funktionen currval und nextval.
Wie von @epic_fil in den Kommentaren hervorgehoben, können Sie allen Sequenzen im Schema Berechtigungen erteilen mit:
quelle
SELECT
notwendig? Sollte nichtUSAGE
abgedeckt werden, was benötigt wird?Da @Phil einen Kommentar hat, der viele Upvotes enthält, die möglicherweise nicht bemerkt werden, verwende ich seine Syntax, um eine Antwort hinzuzufügen, die einem Benutzer Berechtigungen für alle Sequenzen in einem Schema gewährt (vorausgesetzt, Ihr Schema ist die Standardeinstellung "public"). )
quelle
@Tom_Gerken, @epic_fil und @kupson sind mit ihren Anweisungen, die Berechtigungen zum Arbeiten mit vorhandenen Sequenzen zu erteilen, völlig korrekt. Der Benutzer erhält jedoch KEINE Zugriffsrechte auf in Zukunft erstellte Sequenzen. Dazu müssen Sie die Anweisung GRANT mit einer Anweisung ALTER DEFAULT PRIVILEGES wie folgt kombinieren:
Dies funktioniert natürlich nur unter PostgreSQL 9+.
Dadurch werden vorhandene Standardberechtigungen angehängt und nicht überschrieben. Dies ist in dieser Hinsicht recht sicher.
quelle
Führen Sie den folgenden Befehl in postgres aus.
Anmeldung bei postgres:
pgowner wird Ihr Datenbankbenutzer sein.
quelle