PostgreSQL用戶管理
- 一、組角色管理
- 1.1、創建組角色
- 1.2、查看和修改組角色
- 1.3、刪除組角色
- 二、角色的各種權限
- 2.1、LOGIN(登錄)
- 2.2、SUPERUSER(超級用戶)
- 3.3、CREATEDB(創建數據庫)
- 3.4、CREATEROLE(創建角色)
- 3.5、口令
- 三、賬戶管理
- 3.1、創建用戶
- 3.2、刪除用戶
- 3.3、修改用戶密碼
- 四、組角色和用戶權限管理
- 4.1、對組角色授權
- 4.2、對用戶授權
- 4.3、收回組角色權限
- 4.4、收回用戶權限
- 五、數據庫權限管理
- 5.1、修改數據庫的擁有者
- 5.2、增加用戶的數據表權限
- 5.3、刪除用戶的數據表權限
- 六、案例
一、組角色管理
1.1、創建組角色
一個組角色可以看作是一組數據庫用戶。組角色可以擁有數據庫對象(比如表),以及可以把這些對象上的權限賦予其他角色,以控制誰擁有訪問哪些對象的權限。
-- 語法
CREATE ROLE name;
-- name為組角色名稱
-- 創建一個名稱為post2的組角色
create role post2;
1.2、查看和修改組角色
角色存儲在pg_roles
系統表中,用戶可以通過查看此表來查看系統中的角色。
-- 查看系統中的組角色
select rolname from pg_roles;
修改組角色的名稱,SQL語法格式如下:
ALTER ROLE 組角色名稱 RENAME TO 新的組角色名稱
-- 修改組角色post2的名稱為post3
alter role post2 rename to post3
1.3、刪除組角色
-- 語法
DROP ROLE 組角色的名稱
-- 刪除組角色post3
drop role post3;
二、角色的各種權限
一個數據庫角色可以有一系列屬性,這些屬性定義它的權限,以及與客戶認證系統的交互。常見的權限如下。
2.1、LOGIN(登錄)
默認情況下,創建的組角色沒有登錄權限。只有具有LOGN權限的組角色才可以用作數據庫連接的初始角色名。一旦組角色擁有了登錄權限,即可當作用戶名一樣來使用。
創建具有登錄權限的組角色,SQL語法如下:
CREATE ROLE name LOGIN;
-- 創建組角色post4,此組角色具有登錄權限
create role post4 login;
2.2、SUPERUSER(超級用戶)
SUPERUSER擁有對數據庫操作的最高權限,可以完成對數據庫的所有權限檢查。為了保證PostgreSQL的安全,建議用戶謹慎使用SUPERUSER,不要輕易創建它,最好使用非超級用戶完成用戶的大多數工作。
創建數據庫超級用戶,SQL語法如下:
CREATE ROLE name SUPERUSER;
-- 創建組角色post5,此組角色具有超級用戶權限
create role post5 superuser;
只有超級用戶才有權限創建超級用戶
3.3、CREATEDB(創建數據庫)
角色要想創建數據庫,必須明確給出該權限。當然是除了超級用戶以外,因為超級用戶己經具有所有的權限。
創建具有創建數據庫權限的組角色,SQL語法格式如下:
CREATE ROLE name CREATEDB;
-- 創建組角色post6,此組角色具有創建數據庫的權限
create role post6 createdb;
3.4、CREATEROLE(創建角色)
角色要想創建角色,必須明確給出該權限(除了超級用戶以外)。一旦角色具有CREATEROLE權限,即可更改和刪除其他角色,還可以給其他角色賦予或者撤銷成員關系。當然,如果想對超級用戶進行操作,僅有此權限還不夠,還必須擁有SUPERUSER權限。
創建具有創建角色權限的組角色,SQL語法格式如下:
CREATE ROLE name CREATEROLE;
-- 創建組角色post7,此組角色具有創建數據庫的權限
create role post7 createrole;
3.5、口令
在客戶認證方法要求與數據庫建立連接時,需要口令權限。常見的認證方法包括password
、md5
和crypt
。
創建具有口令權限的組角色,SQL語法格式如下:
CREATE ROLE name 口令認證方法 具體口令
-- 創建組角色post8,此組角色具有口令權限
create role post8 password '123456';
只有在必須使用口令的時候,口令才比較重要。另外數據庫口令與操作系統口令是無關的。
三、賬戶管理
在PostgreSQL中可以管理用戶賬號,包括創建用戶、刪除用戶、密碼管理等內容。PostgreSQL數據庫的安全性,需要通過賬戶管理來保證。
3.1、創建用戶
用戶是具有登錄權限的組角色。
-- 創建普通用戶的$QL語法如下:
CREATE USER name
-- 這和下面語句的作用是等價的:
CREATE ROLE name LOGIN
-- 創建用戶名稱為postgre02,并具有創建數據庫和創建角色的權限,同時登錄密碼為'123456789'
create user postgre02 password '123456789' createdb createrole;
3.2、刪除用戶
要想別除用戶,必須擁有CREATEROLE權限。刪除用戶的SQL語法如下:
DROP USER user [, user];
-- DROP USER語句用于刪除一個或多個PostgreSQL賬戶。
-- 使用DROP USER刪除賬戶postgre02
drop user postgre02;
3.3、修改用戶密碼
-- 使用SQL語句修改密碼的語法格式如下:
ALTER USER 用戶名 口令認證方式 新密碼;
-- 將賬戶postgre(01的密碼修改為123123',SQL語句如下:
ALTER USER postgre01 PASSWORD '123123';
-- 命令執行后,即可使用新密碼登錄PostgreSQL服務器。
四、組角色和用戶權限管理
4.1、對組角色授權
-- 用戶還可以使用ALTER ROLE對角色進行授權,語法格式如下
ALTER ROLE 角色名 權限1 權限2 ...;
-- 給post1角色添加創建數據表和創建角色的權限
alter role post1 createdb createrole;
4.2、對用戶授權
-- 用戶還可以使用ALTER USER對用戶進行授權,語法格式如下:
ALTER USER 用戶名 權限1 權限2 ...;
-- 給postgre01用戶添加創建數據表和創建角色的權限
alter user postgre01 createdb createrole;
4.3、收回組角色權限
-- 將post1角色創建數據表和創建角色的權限收回
alter role post1 nocreatedb nocreaterole;
4.4、收回用戶權限
-- 將postgre01用戶創建數據表和創建角色的權限收回
alter user postgre01 nocreatedb nocreaterole;
五、數據庫權限管理
數據庫管理員要對所有用戶的權限進行合理規劃管理。數據庫的操作權限主要包括SELECT、INSERT、UPDATE、DELETE、REFERENCES和TRIGGER等。PostgreSQL權限系統的主要功能是證實連接到一臺給定主機的用戶,并且賦予該用戶在數據庫上的各種權限。
5.1、修改數據庫的擁有者
在創建對象的時候,它會被賦予一個擁有者。通常擁有者就是執行創建語句的角色,用戶可以根據需要修改數據庫的擁有者。
-- 語法
ALTER DATABASE 數據庫名稱 OWNER TO 擁有者名稱;
-- 將mytest數據庫的擁有者修改為postl
alter database mytest owner to post1;
5.2、增加用戶的數據表權限
默認情況下,只有數據庫的所有者可以對其中的數據表進行操作。要允許其他用戶使用這個數據表,必須賦予相應的權限。
-- GRANT 權限 ON 數據表 TO 用戶名稱;
-- 其中,ppol是一個現有的數據表,postgres是一個現有的用戶,允許postgres更新ppo1數據表,使用下面的語句更新表的權限:
grant update on ppo1 to postgres;
-- 如果將上面的語句修改為:
grant update on ppo1 to public;
-- 則表示將數據表pol的更新權限賦予系統中的所有角色。
-- 如果將上面的語句修改為:
grant all on ppo1 to postgres;
-- 則表示把適用于該對象的所有權限都賦予用戶postgres。
5.3、刪除用戶的數據表權限
-- 語法
REVOKE 權限 ON 數據表 FROM [用戶/角色]
-- 撤銷用戶對特定表的所有權限
REVOKE ALL PRIVILEGES ON TABLE table_name FROM username;-- 撤銷特定權限(如 SELECT、INSERT 等)??
REVOKE SELECT, INSERT ON TABLE table_name FROM username;-- 撤銷用戶對模式中所有表的權限?:
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema_name FROM username;-- 撤銷用戶對將來創建的表的默認權限
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name
REVOKE ALL PRIVILEGES ON TABLES FROM username;
六、案例
-- 創建一個數據庫test01
create database test01;-- 選擇test0l數據庫為當前數據庫。在該數據庫下創建數據表mystudent
create table mystudent(numb varchar (30) not null,name varchar (20) not null,score int not null
);-- 創建一個新賬戶,用戶名稱為admin01,密碼為'pw123'
create user admin01 password 'pw123';-- 創建一個新賬戶,用戶名稱為admin02,密碼為'pw456'
create user admin02 password 'pw456';-- 將數據庫test0l的所有者修改為admint01
alter database test01 owner to admin01;
-- 允許用戶admin02可以對數據表mystudent進行查詢、插入和更新操作
grant select, update, insert on mystudent to admin02;-- 別除admin02的賬戶信息
drop user admin02;