ChatGPT解决这个技术问题 Extra ChatGPT

Permission denied for relation

I tried to run simple SQL command:

select * from site_adzone;

and I got this error

ERROR: permission denied for relation site_adzone

What could be the problem here?

I tried also to do select for other tables and got same issue. I also tried to do this:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

but I got this response from console

WARNING: no privileges were granted for "jerry"

Does anyone have any idea what can be wrong?

I am not sure how to update permissions so I can read/write in DB
Welcome to SO! For this question, you may get more help over at dba.stackexchange.com, though you may find just as many snide comments :)
Excuse me. This is the second very programming-related postgresql question I've seen closed as off-topic tonight! The last one had 67,000 views, this one 30,000 views. We should have a popularity clause: Any non-subjective question with > 15,000 views = on topic.
This question is not off topic! It is, however, a duplication of stackoverflow.com/questions/13497352/…

C
Chris Travers

GRANT on the database is not what you need. Grant on the tables directly.

Granting privileges on the database mostly is used to grant or revoke connect privileges. This allows you to specify who may do stuff in the database if they have sufficient other permissions.

You want instead:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

This will take care of this issue.


run it as a superuser, like postgres.
Can this be shortcut somehow? GRANT ALL PRIVILEGES ON ALL TABLES ?
@Shadur GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
@RonE is that restricted to the current database, though?
@zmiftah for schema you need > GRANT ALL PRIVILEGES ON SCHEMA nameSchema TO user;
s
sag

Posting Ron E answer for grant privileges on all tables as it might be useful to others.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

You may also need to execute a similar command for ALL SEQUENCES and ALL FUNCTIONS.
Just for those who were wondering: ALL TABLES also includes views, so there is no separate ALL VIEWS command :-)
stupid question, but how come simply GRANT ALL PRIVILEGES ON SCHEMA public TO jerry; does not give select access on a table inside the schema?
B
BrDaHa

Connect to the right database first, then run:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

connect to right database makes a HUGE dufference :) \connect databasename;
THIS. I was connected to "postgres" all along. Thank You!
Yes connecting to the DB made the difference
K
Klanjabrik
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;

z
zond

1st and important step is connect to your db:

psql -d yourDBName

2 step, grant privileges

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;

i
isapir

To grant permissions to all of the existing tables in the schema use:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

To specify default permissions that will be applied to future tables use:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

e.g.

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

If you use SERIAL or BIGSERIAL columns then you will probably want to do the same for SEQUENCES, or else your INSERT will fail (Postgres 10's IDENTITY doesn't suffer from that problem, and is recommended over the SERIAL types), i.e.

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

See also my answer to PostgreSQL Permissions for Web App for more details and a reusable script.

Ref:

GRANT

ALTER DEFAULT PRIVILEGES


as well as references, truncate, trigger
This needs to be way higher up, this is what did the trick for me, the usual grant was being executed, but due to no tables being there yet it did not take any effect. Perhaps this is also something version specific.
s
salvador

This frequently happens when you create a table as user postgres and then try to access it as an ordinary user. In this case it is best to log in as the postgres user and change the ownership of the table with the command:

alter table <TABLE> owner to <USER>;

Very nice! It's painful to know this, but this is what I had ended up doing. :D (facepalm)
B
Brian McCall

Make sure you log into psql as the owner of the tables. to find out who own the tables use \dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

then you can run the GRANTS


h
happydmitry

You should:

connect to the database by means of the DBeaver with postgres user on the left tab open your database open Roles tab/dropdown select your user on the right tab press 'Permissions tab' press your schema tab press tables tab/dropdown select all tables select all required permissions checkboxes (or press Grant All) press Save


J
Jens Timmerman

I ran into this after switching a user to another user that also needed to have the same rights, I kept getting the error: "must be owner of relation xx"

fix was to simply give all rights from old user to new user:

postgres-# Grant <old user> to <new user>;


S
Sergi Ramón

As you are looking for select permissions, I would suggest you to grant only select rather than all privileges. You can do this by:

GRANT SELECT ON <table> TO <role>;