首先本身整理了個權限表,以下:sql
lihao=# \dp+數據庫
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
----------+-----------------+--------+---------------------+--------------------------oracle
public | t1 | table | lihao=arwdDxt/lihao |
public | t2 | table | lihao=arwdDxt/lihao |post
在這個權限表,我以爲有兩個比較特殊:LOGIN和SUPERUSERspa
很顯然,這就是一個登錄權限,但它倒是NO.1權限,若是沒有這個權限,那麼哪怕是超級用戶也不能登錄數據庫,以下實驗:postgresql
lihao=# create role user1 nologin superuser password '123456';
CREATE ROLE
lihao=# \du+
List of roles
Role name | Attributes | Member of | Description
---------+-----------------------------------------+--------+-------------
lihao | Superuser, Create role, Create DB, Replication | {} |
user1 | Superuser, Cannot login, Replication | {} |
lihao=# \c lihao user1;
FATAL: role "user1" is not permitted to log in
Previous connection kept
lihao=# alter role user1 login;
ALTER ROLE
lihao=# \c lihao user1;
You are now connected to database "lihao" as user "user1".
lihao=#ip
與login權限對應的還有一個登錄權限,那就是數據庫的CONNECT權限。在以前的博文《postgresql角色(一)》中提到過,默認建立的角色都會擁有public角色在全部數據庫的connect權限,那麼接下來作個實驗看看:
lihao=# create user user1 nologin password 123456';
CREATE ROLE
lihao=# create user user2 password '123456';
CREATE ROLE
lihao=# revoke connect on database db1 from public;
REVOKE
lihao=# \c db1 user1
FATAL: role "user1" is not permitted to log in
Previous connection kept
lihao=# \c db1 user2
FATAL: permission denied for database "db1"
DETAIL: User does not have CONNECT privilege.
Previous connection kept
lihao=#it
結合這個實驗以及以前的實驗,咱們能夠看出,對一個用戶而言,只有同時擁有LOGIN和CONNECT權限才能夠對數據庫進行訪問。io
表格的「系統權限」所列的幾個權限,除了LOGIN以外,對SUPERUSER而言,其餘都可無視。table
lihao=# create role role1 superuser nocreatedb nocreaterole login password 'oracle'; CREATE ROLE lihao=# \c lihao role1 You are now connected to database "lihao" as user "role1". lihao=# create database db1 owner "lihao"; CREATE DATABASE lihao=# create role role2 ; CREATE ROLE