postgresql一些常用命令

下文總結作者在工作中用到的postgresql一些常用命令

一、Postgresql數據庫權限功能小結

1、權限說明

    Postgresql數據庫支持靈活的權限管理,可以控制一個角色(組、用戶)對某張表的讀、寫、更新、刪除等操作權限、執行某個函數的權限以及操作(使用、更新等)視圖、序列的權限。

    PG的權限管理功能比較強大,可以細化到對一張表的各個字段,比如禁止用戶訪問一張表裏的密碼字段等,在稍後的內容中給出詳細的解釋。

    雖然在PG數據庫中把用戶、角色統一叫做角色,甚至創建語句都爲create role XXX,但用戶和角色之間仍有一定的區別。在這裏我們統一把擁有登錄權限的叫做用戶,沒有登錄權限的叫做角色,用此方式加以區分。實際上,在PgAdmin管理工具中,可以看到用戶和角色的區別,沒有登錄權限的被放在組角色下,有登錄權限的被放在登錄角色下。

2、基本權限

用戶和角色都可以被賦予基本權限,比如創建數據庫權限、超級用戶權限、創建角色權限等。

比如創建用戶的語句爲:

CREATE ROLE username LOGIN 

#注意上述username擁有LOGIN的權限,所以叫它用戶。

創建角色的語句爲:

CREATE ROLE "group" 
#注意這裏沒有LOGIN權限,所以是角色。

上述角色和用戶的創建語句中,都沒有賦予超級用戶、創建數據庫等權限。

3、操作數據庫對象權限

只能把數據庫對象的操作權限賦予沒有登錄權限的角色,而不能直接賦予擁有登錄權限的用戶。

那麼這樣就帶來一個問題,怎麼樣控制登錄用戶操作數據庫對象的權限呢?

答案是讓用戶成爲角色的成員,此時用戶即可擁有角色的權限,進一步限制了登錄用戶操作數據庫對象的權限。

如把上述角色group賦予guest用戶:

GRANT "group" TO guest;

賦權之後guest用戶就擁有了group角色所擁有的數據庫對象權限。比如控制group角色只能對class表執行Insert操作:

GRANT INSERT ON TABLE class TO "group";

此時使用guest用戶登錄數據後,就只能對錶class執行insert操作,無法執行delete、update等操作。

示例代碼如下,使用guest用戶登錄,訪問TEST數據庫下的class表。

postgres=> \c TEST     您現在已經連線到數據庫 "TEST",用戶 "guest". 

TEST=> select * from class; 

ERROR: permission denied for relation class 

TEST=> insert into class values(2,'class1'); 

INSERT 0 1

從上述結果中可以看到,guest用戶沒有權限查詢class表,但是可以插入數據庫。原因就是隻對group角色賦予了class表的insert權限,然後guest用戶也就只有class表的insert權限。

前面說到PG的權限管理可以細化到表的某個字段,現在繼續用class表和guest用戶做實驗。

TEST=> \c postgres postgres;         您現在已經連線到數據庫 "postgres",用戶 "postgres". 

postgres=# \c TEST;                         您現在已經連線到數據庫 "TEST",用戶 "postgres". 

TEST=# grant select(num) on class to "group";         GRANT 操作

TEST=# \echo                 切換到postgres用戶連接TEST數據庫,對class表的num字段的select權限賦予group角色 切換到postgres用戶連接TEST數據庫,對class表的num字段的select權限賦予group角色 

TEST=# \c TEST               guest 用戶 guest 的口令: 您現在已經連線到數據庫 "TEST",用戶 "guest". 

TEST=> \echo                  切換回guest用戶登錄TEST數據庫 切換回guest用戶登錄TEST數據庫 

TEST=> select * from class; 

ERROR: permission denied for relation class 

TEST=> select num from class; 

num 

從上述結果中可以看到,guest用戶依然沒有查詢class表的權限,但是卻有了查詢class表裏的num字段的權限。

在PG數據庫中不單單可以控制操作表的權限,其他數據庫對象,比如序列、函數、視圖等都可以控制。

所以PG的權限控制功能非常強大。

4、解除權限

賦值之後如需解除使用REVOKE命令:

解除select權限

REVOKE select ON tableName FROM "group";  

解除所有權限

REVOKE ALL ON tableName FROM PUBLIC ;

5、一些常用命令總結

創建用戶

CREATE ROLE username LOGIN 

注意上述username擁有LOGIN的權限,所以叫它用戶。

給用戶創建密碼

alter user useName with password 'password';

刪除用戶

drop role name ;

給用戶賦權select

grant select on all tables in schema public to username ;

撤銷權限

revoke select on tablename from username;

導出建表語句

pg_dump -s database > database.sql

重新在pgsql中重建表

psql -p 5432 -f database.sql database

顯示SQL執行時間

timing on;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章