PostgreSQL 默認權(quán)限查看方式
如何查看PostgreSQL默認權(quán)限
當我們對Postgresql的某個用戶授予默認權(quán)限時, pg_default_acl表存儲要被分配給新創(chuàng)建對象的初始權(quán)限。你可能通過查詢該表獲取默認權(quán)限,先了解下官方文檔的解釋:
表 50-17. pg_default_acl的列:
| 名稱 | 類型 | 引用 | 描述 |
|---|---|---|---|
| oid | oid | 行標識符(隱藏屬性,必須被顯式選擇才會顯示) | |
| defaclrole | oid | pg_authid.oid | 與此項相關(guān)的角色的OID |
| defaclnamespace | oid | pg_namespace.oid | 與此項相關(guān)的名字空間的OID,如果沒有則為0 |
| defaclobjtype | char | 此項適合的對象類型: r = 關(guān)系(表、視圖), S = 序列, f = 函數(shù), T = 類型 | |
| defaclacl | aclitem[] | 此類對象在創(chuàng)建時應用有的訪問權(quán)限 |
一個pg_default_acl項展示了要分配給屬于一個指定用戶的對象的初始權(quán)限。當前有兩類項:defaclnamespace = 0的"全局"項和引用一個特殊模式的"每模式"項。如果一個全局項存在,則它重載該對象類型的普通hard-wired默認權(quán)限。一個每模式項如果存在,表示權(quán)限將被加入到全局或hard-wired默認權(quán)限中。
添加默認權(quán)限
演示數(shù)據(jù)庫版本:PostgreSQL 9.6.8
這里我們測試給test用戶添加“abc”模式的默認權(quán)限,先查看下當前schema的所有者:
// 查看當前schema的所有者,相當于\du元命令 SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ORDER BY 1;
查詢結(jié)果如圖所示,模式“abc”的所有者為postgresql用戶

針對模式“abc”, 使用超級管理員postgresql給普通用戶test授權(quán),命令如下:
// 最后一條命令就是授予初始權(quán)限 grant select on all tables in schema abc to test; grant usage on schema abc to test; alter default privileges in schema abc grant select on tables to test;
查看默認權(quán)限
授權(quán)完成,通過pg_default_acl表查看默認權(quán)限
// 查看初始權(quán)限 select * from pg_catalog.pg_default_acl;

這樣看其實不是很直觀,可以使用下面的SQL來查看:
// 查看初始權(quán)限 SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS "Granter", n.nspname AS "Schema", CASE d.defaclobjtype WHEN 'r' THEN 'table' WHEN 'S' THEN 'sequence' WHEN 'f' THEN 'function' WHEN 'T' THEN 'type' END AS "Type", pg_catalog.array_to_string(d.defaclacl, E', ') AS "Access privileges" FROM pg_catalog.pg_default_acl d LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace ORDER BY 1, 2, 3;
輸出結(jié)果如下: 表示通過Postgresql超級用戶授予test普通用戶對模式“abc”有讀的權(quán)限。

在此,我們再把模式“abc”的擁有者(owner)修改為dbadmin用戶(可以事先創(chuàng)建好),執(zhí)行以下命令:
// 修改模式“abc”擁有者為:dbadmin ALTER SCHEMA abc OWNER TO "dbadmin"; // 查看模式的擁有者,相當于\du元命令 SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ORDER BY 1;

現(xiàn)在我們使用dbadmin用戶登錄連接到數(shù)據(jù)庫,給普通用戶test添加默認權(quán)限,其實上面已經(jīng)通過postgresql超級用戶給test用戶加過默認權(quán)限了。 這里演示使用dbadmin用戶再添加一次,目的是演示pg_default_acl表會出現(xiàn)2條記錄,使用dbadmin用戶執(zhí)行以下命令:
alter default privileges in schema abc grant select on tables to test;
再次查看pg_default_acl表會出現(xiàn)兩行記錄:

一行是dbadmin擁有者授予的讀權(quán)限。 一行是postgresql超級用戶授權(quán)的讀權(quán)限。
補充:PostgreSQL基本配置與權(quán)限控制
修改PgSQL基本配置:
重要文件和目錄:
配置文件: postgresql.conf 登錄權(quán)限控制文件: pg_hba.conf 數(shù) 據(jù) 目 錄 : base 運行日志目錄: log 歸檔日志目錄: pg_wal
修改PgSQL偵聽地址:
在單引號內(nèi)寫入IP地址,如果要偵聽多個IP地址,以逗號分隔
[root@postgrssql ~]# vim /var/lib/pgsql/11/data/postgresql.conf listen_addresses = 'localhost,172.18.1.76'
修改PgSQL偵聽端口:
默認端口 5432
[root@postgrssql ~]# vim /var/lib/pgsql/11/data/postgresql.conf port = 5432
修改PgSQL最大連接數(shù):
修改連接數(shù)需要重啟,對比MySQL一般設(shè)置 512 ~ 1024
[root@postgrssql ~]# vim /var/lib/pgsql/11/data/postgresql.conf max_connections = 100
打開PgSQL復制日志:
類似于MySQL binlog,復制到從庫并應用一遍日志操作就達到數(shù)據(jù)同步了
# 是否開啟 archive_log日志功能 archive_mode = on # 歸檔 archive_log日志要執(zhí)行的命令,當前不準備歸檔就執(zhí)行 cd命令 archive_command = 'cd .' [root@postgrssql ~]# ll -sh /var/lib/pgsql/11/data/pg_wal total 16M M -rw------- 1 postgres postgres 16M Nov 23 20:47 000000010000000000000001 0 drwx------ 2 postgres postgres 6 Nov 22 15:21 archive_status
PgSQL用戶權(quán)限控制:
在數(shù)據(jù)庫中創(chuàng)建對象時,都會為其分配所有者。 所有者通常是執(zhí)行創(chuàng)建語句的用戶。 對于大多數(shù)類型的對象,初始狀態(tài)是只有所有者(或超級用戶)可以修改或刪除對象。 要允許其他角色或用戶使用它,必須授予權(quán)限或權(quán)限。
配置超管用戶安全:
默認是 all 所有用戶都擁有peer對等權(quán)限,只修改為postgrs用戶擁有peer權(quán)限
[root@postgrssql ~]# sed -i '80d' /var/lib/pgsql/11/data/pg_hba.conf [root@postgrssql ~]# sed -i '79a local all postgres peer' /var/lib/pgsql/11/data/pg_hba.conf
創(chuàng)建用戶:
# 創(chuàng)建 olda 用戶
postgres=# create user olda with password '123456';
CREATE ROLE
# 查看所有用戶
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
olda | | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
用戶授權(quán)權(quán)限:
# 切換到 course 數(shù)據(jù)庫
postgres=# \c course
You are now connected to database "course" as user "postgres".
# 在 course 數(shù)據(jù)庫授權(quán)所有表的所有權(quán)限到 olda用戶
course=# grant all on all tables in schema public to olda;
GRANT
# 查看 course 數(shù)據(jù)庫所有表的權(quán)限表信息
course=# \dp+
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+----------+-------+---------------------------+-------------------+----------
public | students | table | postgres=arwdDxt/postgres+| |
| | | olda=arwdDxt/postgres | |
(1 row)
配置用戶連接:
在PgSQL內(nèi)創(chuàng)建用戶后也是不可以登錄的,需要在pg_hba.conf文件中配置連接源信息,否則不允許遠程登錄。
加入 olda用戶,local本地可以登錄所有庫,登錄密碼驗證方式為md5
[root@postgrssql ~]# vim /var/lib/pgsql/11/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local all postgres peer
local all olda 0.0.0.0/0 md5
# 重載 PostgreSQL
systemctl reload postgresql-11.service
# 測試 olda用戶連接 PgSQL的 course庫
-bash-4.2$ psql -U olda -W course
Password:
psql (11.6)
Type "help" for help.
course=> \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
course | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
配置默認權(quán)限:
意思為 postgres用戶創(chuàng)建的所有表都默認對 olda用戶重新授予權(quán)限
postgres=# alter default privileges for role postgres grant all on tables to olda; ALTER DEFAULT PRIVILEGES
配置用戶遠程連接:
默認在pg_hba.conf文件中加入密碼驗證方式還是不可以遠程訪問,因為是 local方式。 加入 olda用戶,host方式,所有來源IP都可以登錄所有庫,登錄密碼驗證方式為md5 -bash-4.2$ psql -U olda -W -h 172.18.1.76 -p 5432 course Password: psql: FATAL: no pg_hba.conf entry for host "172.18.1.76", user "olda", database "course", SSL off [root@postgrssql ~]# vim /var/lib/pgsql/11/data/pg_hba.conf # "local" is for Unix domain socket connections only local all postgres peer local all olda md5 host all olda 0.0.0.0/0 md5 # 重載 PostgreSQL [root@postgrssql ~]# systemctl reload postgresql-11.service # 測試是否可以遠程連接到 PostgreSQL -bash-4.2$ psql -U olda -W -h 172.18.1.76 -p 5432 course Password: psql (11.6) Type "help" for help. course=>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
postgresql使用filter進行多維度聚合的解決方法
這篇文章給大家介紹postgresql使用filter進行多維度聚合的解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-07-07
Postgresql中json和jsonb類型區(qū)別解析
在我們的業(yè)務開發(fā)中,可能會因為特殊【歷史,偷懶,防止表連接】經(jīng)常會有JSON或者JSONArray類的數(shù)據(jù)存儲到某列中,這個時候再PG數(shù)據(jù)庫中有兩種數(shù)據(jù)格式可以直接一對多或者一對一的映射對象,接下來通過本文介紹Postgresql中json和jsonb類型區(qū)別,需要的朋友可以參考下2024-06-06
解決postgresql 數(shù)據(jù)庫 update更新慢的原因
這篇文章主要介紹了解決postgresql 數(shù)據(jù)庫 update更新慢的原因,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
PostgreSQL使用MySQL作為外部表(mysql_fdw)
PostgreSQL 提供了一種訪問和操作外部數(shù)據(jù)源的機制,稱為外部數(shù)據(jù)包裝器,本文主要給大家介紹了PostgreSQL使用MySQL作為外部表的方法,感興趣的朋友跟隨小編一起看看吧2022-11-11
PostgreSQL upsert(插入更新)數(shù)據(jù)的操作詳解
這篇文章主要介紹了PostgreSQL upsert(插入更新)教程詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

