1.結論
1.schema是每個database中都有的。 schema概念有點像命名空間或者把它想像成一個文件系統中的目錄
2.user是pg cluster級別的。
3.查詢表,是指定 schema.tablename
USER : -> 可以在DB里創建同名的schema ,指定 search_path
DB : -> 每個DB 有自己的owner ,默認為超級用戶 postgres
SCHEMA : -> 在DB里面,有了schema才可以創建對象,默認為schema為 public
注意事項:
1.用戶創建的所有對象都被創建在指定的schema(或namespace)中。其他用戶可能擁有、也可能不擁有訪問這些對象的權限,甚至都不可以在對應的schema中創建對象。
2.用戶(或角色)是全局對象,不是定義在數據庫中,而是定義在實例的級別。schema是用戶在指定的數據庫中創建的,其中包含數據庫對象。
3.postgresql數據庫默認都有一個public schema,如果沒有為對象顯式地指定schem
4.db owner不一定能操作其下面的某個schema (db里的 schema 的owner 可以指定其它user)
5.schema owner 不一定能操作其下面的某張表 (需要有表的權限,或table owner)
6、授予某個用戶select on all tables in schema XX時,需要先對用戶授權usage訪問schema XX,否則會出現報錯Invalid operation: permission denied for schema XX;
grant usage on schema s9 to owner_2;
grant select on all tables in schema s9 to owner_2;
7、以上第6項僅用戶只能查詢該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都可以訪問
alter default privileges in schema s9 grant select on tables to owner_2;
--當前用戶執行如上語句后,此用戶在s9下新建的任何表,owner_2都可以訪問(其他用戶用戶創建的表,owner_2不能訪問)
--上述語句不是這個意思:對於任何用戶在s9下新建的表,owner_2都可以訪問
alter default privileges for user user1,user2 in schema s9 grant select on tables to owner_2;
--以后user1,user2在schema s9下新建的表,用戶owner_2都可以訪問
備注:目前postgresql沒有一種方法,可以使以后任何用戶在s9下新建的表,owner_2都可以訪問。
2.測試
2.1 測試用戶1
# 創建huyi 一個用戶,2個db
postgres=#CREATE USER huyi WITH PASSWORD 'huyi'
postgres=#CREATE DATABASE huyidb OWNER huyi;
postgres=#GRANT ALL PRIVILEGES ON DATABASE huyidb TO huyi;
postgres=#CREATE DATABASE huyidb2 OWNER huyi;
postgres=#GRANT ALL PRIVILEGES ON DATABASE huyidb2 TO huyi;
postgres=# \l
psql -h 127.0.0.1 -U huyi -d huyidb
huyidb=> create table t1(a int);
huyidb=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
public | t1 | table | huyi
(1 row)
# 創建和用戶同名的huyi
huyidb=> create schema huyi;
CREATE SCHEMA
huyidb=> create table t2(a int);
CREATE TABLE
huyidb=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
huyi | t2 | table | huyi
public | t1 | table | huyi
(2 rows)
huyidb=> show search_path;
search_path
-----------------
"$user", public
(1 row)
# 創建新的schem 的huyisc , 我們發現我們的schema owner 默認是我們的username
huyidb=> \dn
List of schemas
Name | Owner
--------+----------
huyi | huyi
huyisc | huyi
public | postgres
(3 rows)
# 設置search_path
set search_path = 'huyisc',"$user",public;
huyidb=> show search_path ;
search_path
-------------------------
huyisc, "$user", public
(1 row)
# 創建T3表 指定huyisc
huyidb=> create table huyisc.t3(a int);
CREATE TABLE
huyidb=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
huyi | t2 | table | huyi
huyisc | t3 | table | huyi
public | t1 | table | huyi
(3 rows)
2.2測試用戶2
# 新創建用戶huyi2,新把huyidb2授權給 huyi2 ; 即huyidb2 同時授權給huyi,huyi2 兩個用戶
postgres=# CREATE USER huyi2 WITH PASSWORD 'huyi2' ;
CREATE ROLE
postgres=#
postgres=# GRANT ALL PRIVILEGES ON DATABASE huyidb2 TO huyi2;
GRANT
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+------------------------------
huyidb | huyi | UTF8 | C | C | =Tc/huyi +
| | | | | huyi=CTc/huyi
huyidb2 | huyi | UTF8 | C | C | =Tc/huyi +
| | | | | huyi=CTc/huyi +
| | | | | huyi2=CTc/huyi
# 以huyi2 用戶在huyidb2 中創建 schema testsc 指定owner 為 huyi
postgres=# GRANT "huyi" to huyi2;
GRANT ROLE
psql -h 127.0.0.1 -U huyi2 -d huyidb2
huyidb2=> create schema testsc AUTHORIZATION huyi ;
CREATE SCHEMA
huyidb2=> \dn
List of schemas
Name | Owner
--------+----------
public | postgres
testsc | huyi
(2 rows)
set search_path = 'testsc',"$user",public;
# 創建T4表指定testsc
huyidb2=> create table testsc.t4(a int);
CREATE TABLE
huyidb2=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
testsc | t4 | table | huyi2
(1 row)
# 這時雖然Schema 的Owner 是 huyi ,但table 的owner 還是huyi2 所以用huyi是查不到t4 數據庫的
psql -h 127.0.0.1 -U huyi -d huyi2
huyidb2=> select * from testsc.t4;
ERROR: permission denied for table t4
# 更改t4表的owner 到huyi 后可以查詢
psql -h 127.0.0.1 -U huyi2 -d huyi2
huyidb2=> alter table testsc.t4 OWNER TO huyi ;
ALTER TABLE
huyidb2=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
testsc | t4 | table | huyi
(1 row)
huyidb2=>
#在次以huyi 用戶登錄查詢
psql -h 127.0.0.1 -U huyi -d huyi2
huyidb2=> select * from testsc.t4;
a
---
(0 rows)
#現在用huyi 還是huyi2用戶 都可查詢 ,
#huyi 用戶
huyidb2=> select * from testsc.t4;
a
---
(0 rows)
#huyi2 用戶
huyidb2=> select * from testsc.t4;
a
---
(0 rows)
#因為huyidb庫里面 ,huyi2 里有 huyi信息的Member ;
huyidb2=> \du
List of roles
Role name | Attributes | Member of
-----------------+------------------------------------------------------------+-----------------------
huyi | | {}
huyi2 | | {huyi}
select current_schemas(true);
#當 回收huyi2用戶里的 huyi的member 信息時,就沒有權限
postgres@s2ahumysqlpg01-> psql -h 127.0.0.1
psql (12.4)
Type "help" for help.
postgres=# revoke "huyi" from huyi2;
REVOKE ROLE
postgres=# quit
postgres@s2ahumysqlpg01-> psql -h 127.0.0.1 -U huyi2 -d huyidb2
psql (12.4)
Type "help" for help.
huyidb2=> select * from testsc.t4;
ERROR: permission denied for schema testsc
#這里要用同時授權這2個權限, huyi2步可以又訪問t4這張表了
grant USAGE on SCHEMA testsc to huyi2 ;
grant SELECT on testsc.t4 to huyi2 ;
postgres@s2ahumysqlpg01-> psql -h 127.0.0.1 -U huyi2 -d huyidb2
psql (12.4)
Type "help" for help.
huyidb2=> select * from testsc.t4;
a
---
(0 rows)
2.3 補充
select current_database(); --當前db 或直接 \c
select current_user; ---查看當前用戶 \ 或 select user;
pg_catalog存放了各系統表,內置函數等等,它總是在搜索路徑中,需要通過current_schemas看到
select current_schemas(true);
show search_path ;
參考
https://www.cnblogs.com/abclife/p/13905336.html
http://blog.itpub.net/30126024/viewspace-2661690/