共計 5975 個字符,預計需要花費 15 分鐘才能閱讀完成。
這篇文章主要介紹“postgresql 關于權限的知識點有哪些”,在日常操作中,相信很多人在 postgresql 關于權限的知識點有哪些問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”postgresql 關于權限的知識點有哪些”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!
1、每個實例可以多個 db,每個 db 有自己的 owner,每個 db 下可以建立多個 schema,每個 schema 有自己的 owner,每個 schema 下可以創(chuàng)建多張表,每張表都有自己的 owner
2、db owner 不一定能操作其下面的某個 schema
3、schema owner 不一定能操作其下面的某張表
4、授予某個用戶 select on all tables in schema XX 時,需要先對用戶授權 usage 訪問 schema XX
grant usage on schema s9 to owner_2;
grant select on all tables in schema s9 to owner_2;
– 授權 owner_2 可以查詢 s9 下面的所有表,這種方式僅對已經存在的表有效。以后建立的表不會自動有只讀權限
5、以上 4 僅用戶只能查詢該 schema 下已經存在的表,無法查詢該 schema 下新建的表,如果想對該 schema 下新建的表也獲得權限,需要對該 schema 的 owner 授權給用戶
alter default privileges for user s9_owner in schema s9 grant select on tables to owner_2;
– 以后 schema s9 的 owner s9_owner 在 schema s9 下新建的表, 用戶 owner_2 都可以訪問
6、pg_hba.conf 的執(zhí)行順序是從上到下的, 也就是上面的生效。pg_hba.conf 是一個客戶端的認證的文件,他限制的并不是權限,而是你是只能來自于哪里,必須使用什么認證方式
db owner 不一定能操作其下面的某個 schema
schema owner 不一定能操作其下面的某張表
1、superuser 建立 3 個用戶 dbuser1、schemauser1、schemauser2,授權用戶 dbuser1 具備 create db 權限
create user dbuser1 createdb password 123456
create user schemauser1 password 123456
create user schemauser2 password 123456
2、dbuser1 創(chuàng)建 DB1,superuser 授權 schemauser1、schemauser2 在 db1 上有創(chuàng)建 schema 的權限
\c – dbuser1
create database db1;
\c – postgres
grant create on database db1 to schemauser1;
grant create on database db1 to schemauser2;
3、schemauser1、schemauser2 分別在 db1 上創(chuàng)建 schema1、schema2,并建立表 schema1.table1、schema2.table2
\c db1
\c – schemauser1
create schema schema1;
create table schema1.table1 (hid int);
insert into schema1.table1 values (1),(2);
select * from schema1.table1;
\c – schemauser2
create schema schema2;
create table schema2.table2 (hid int);
insert into schema2.table2 values (1),(2);
select * from schema2.table2;
4、superuser 在 db1.schema1、db1.schema2 上建立表 supertable1,supertable2
\c – postgres
create table schema1.supertable1 (hid int);
insert into schema1.supertable1 values (1),(2);
select * from schema1.supertable1;
create table schema2.supertable2 (hid int);
insert into schema2.supertable2 values (1),(2);
select * from schema2.supertable2;
5、驗證
5.1、dbuser1 是否可以查詢 schema1.table1、schema2.table2、schema1.supertable1、schema2.supertable2
不可以
5.2、dbuser1 是否可以在 schema1、schema2 上建立表 schema1.dbtable1、schema2.dbtable2
不可以
5.3、schemauser1 是否可以查詢 schema1.supertable1、schema2.table2、schema2.supertable2
不可以
5.4、schemauser2 是否可以查詢 schema2.supertable2、schema1.table1、schema1.supertable1
不可以
\c – dbuser1
db1= select * from pg_tables WHERE tablename NOT LIKE pg% AND tablename NOT LIKE sql_% ORDER BY tablename;
schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
————+————-+————-+————+————+———-+————-+————-
schema1 | supertable1 | postgre2 | | f | f | f | f
schema2 | supertable2 | postgre2 | | f | f | f | f
schema1 | table1 | schemauser1 | | f | f | f | f
schema2 | table2 | schemauser2 | | f | f | f | f
(4 rows)
db1= select * from schema1.table1;
ERROR: permission denied for schema schema1
LINE 1: select * from schema1.table1;
db1= select * from schema1.supertable1;
ERROR: permission denied for schema schema1
LINE 1: select * from schema1.supertable1;
db1= create table schema1.dbtable1 (hid int);
ERROR: permission denied for schema schema1
LINE 1: create table schema1.dbtable1 (hid int);
db1= create table schema2.dbtable2 (hid int);
ERROR: permission denied for schema schema2
LINE 1: create table schema2.dbtable2 (hid int); 光授權 select on all tables in schema,而沒有授權 usage on schema,用戶無法查詢 schema 下的表
postgres=# create user testuser1 password 123456
CREATE ROLE
postgres=# create user testuser2 password 123456
CREATE ROLE
db1=# grant select on all tables in schema schema1 to testuser1;
GRANT
db1=# \c – testuser1
You are now connected to database db1 as user testuser1 .
db1= select count(*) from schema1.table1;
ERROR: permission denied for schema schema1
LINE 1: select * from schema1.table1;
db1= \c – postgres
db1=# grant usage on schema schema1 to testuser1;
GRANT
db1=# \c – testuser1
You are now connected to database db1 as user testuser1 .
db1= select count(*) from schema1.table1;
count
——-
2
(1 row)db1=# grant usage on schema schema1 to testuser2;
GRANT
db1=# grant select on all tables in schema schema1 to testuser2;
GRANT
db1=# \c – testuser2
You are now connected to database db1 as user testuser2 .
db1= select count(*) from schema1.table1;
count
——-
2
(1 row)schema 下新建的表也能被授權用戶查詢,需要對該 schema 的 owner 授權給用戶, 如下 testuser1 和 testuser2 都具備 select on all tables in schema schema1,schema1 的 owner 是 schemauser1,schemauser1 的權限授給了 testuser2,所以 schemauser1 在 schema1 新建的表,testuser2 可以查詢,但是 testuser1 無法查詢
db1= \c – postgres
db1=# alter default privileges for user schemauser1 in schema schema1 grant select on tables to testuser2;
db1=# \c – schemauser1
db1= select * into schema1.table3 from schema1.table1;
db1= \c – testuser1
You are now connected to database db1 as user testuser1 .
db1= select * from schema1.table3;
ERROR: permission denied for table table3
db1= \c – testuser2
You are now connected to database db1 as user testuser2 .
db1= select * from schema1.table3;
hid
—–
1
2
(2 rows)
沒有 createdb 權限,則無法創(chuàng)建 database,有了 createdb 權限還可以在自己創(chuàng)建的 db 下創(chuàng)建 schema
postgres=# \c – testuser1
You are now connected to database postgres as user testuser1 .
postgres= create database testdb;
ERROR: permission denied to create database
postgres= \c – postgres
postgres=# alter user testuser1 createdb;
postgres=# \c – testuser1
postgres= create database testdb;
CREATE DATABASE
postgres= \c testdb
You are now connected to database testdb as user testuser1 .
testdb= create schema tests1;
CREATE SCHEMA 在其他 db_ower 的 db 下,沒有授權 CREATE on database 權限的話,用戶無法創(chuàng)建 schema,有了 create 權限后,在自己建立的 schema 下可以創(chuàng)建表
testdb= \c db1
You are now connected to database db1 as user testuser1 .
db1= create schema tests2;
ERROR: permission denied for database db1
testdb= \c – postgres
db1=# grant CREATE on database db1 to testuser1;
db1=# \c – testuser1
db1= create schema tests2;
db1= create table tests2.table1 (hid int); 在其他 schema_owner 的 schema 下,沒有 CREATE on schema 權限的話,用戶無法創(chuàng)建表
db1= \c – postgres
db1=# create schema tests3;
db1=# \c – testuser1
db1= create table tests3.table (hid int);
ERROR: permission denied for schema tests3
LINE 1: create table tests3.table (hid int);
db1= \c – postgres
db1=# grant CREATE on schema tests3 to testuser1;
db1= create table tests3.table (hid int);
CREATE TABLE
pg_hba.conf 上面的生效
pg_hba.conf 內容如下,則 systemctl restart postgresql-11 后,本地 psql 命令需要密碼
local all all md5
local all all trust
pg_hba.conf 內容如下,則 systemctl restart postgresql-11 后,本地 psql 命令不需要密碼
local all all trust
local all all md5
到此,關于“postgresql 關于權限的知識點有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注丸趣 TV 網(wǎng)站,丸趣 TV 小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>