PG里 user,db,schema,table 之間的關系


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/






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM