9.PG数据库层权限管理(pg系列课程)第2遍
一、PostgreSQL数据库属主
- Postgres中的数据库属主属于创建者,只要有createdb的权限就可以创建数据库,数据库属主不一定拥有存放在该数据库中其它用户创建的对象的访问权限。
- 数据库在创建后,允许public角色连接,即允许任何人连接。(如果要限制某个用户,那么先要取消public用户的权限。)
- 数据库在创建后不允许除了超级用户和owner之外的任何人在数据库中创建schema。(允许创建表不允许创建schema。是因为创建的表是默认在public下的,如果要创建schema的话需要单独授权)
- 数据库在创建后,会自动创建名为public的schema,这个schema的al权限已经赋予给了public角色,即允许任何人在里面创建对象,但对己存在的其它用户的表不具有任何权限。
二、PostgreSQl数据库权限
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }ON DATABASE database_name [, ...]TO role_specification [, ...] [ WITH GRANT OPTION ][ GRANTED BY role_specification ]
(一)CREATE:
可以在指定数据库创建schema的权限
(建表的权限不需要单独给,建库的时候就已经把建表的权限给了public)
例如:grant create on database test01 to u1;
(二)CONNECT:
可以连接到指定数据库的权限
授权用户连接数据库的权限
grant connect on database db_name to user_name;撤销用户连接数据库的权限
revoke connect on database db_name from public;
revoke connect on database db_name from user_name;由于数据库在创建后,允许public角色连接,即允许任何人连接。所以如果要取
消某个用户对指定数据库连接的权限,需要先取消public的连接权限,再取消该
用户的连接权限。
(三)TEMPORARY:
可以创建临时表的权限
(四)ALL:
指定数据库所有的权限
(五)查看哪些用户有哪些数据库的哪些权限
查看哪些用户有哪些数据库的哪些权限
select datname,datacl from pg_database where datname='db_name';datacl 列是一个数组类型,权限条目通常以以下格式表示:
rolename=权限/授予者rolename:拥有权限的角色或用户。
权限:授予的权限,例如 CTc(CREATE、TEMPORARY、CONNECT)。
授予者:授予该权限的角色。datname | datacl
---------+------------------------------------------------mydb | {admin=CTc/postgres,user1=c/postgres}postgres| template1 | {=c/postgres,postgres=CTc/postgres}template0 | {=c/postgres,postgres=CTc/postgres}admin=CTc/postgres 表示用户 admin 拥有 CREATE、TEMPORARY 和 CONNECT 权限,这些权限是由 postgres 用户授予的。
user1=c/postgres 表示用户 user1 拥有 CONNECT 权限,这些权限是由 postgres 用户授予的。
=c/postgres 表示所有用户(PUBLIC)都拥有 CONNECT 权限,这些权限是由 postgres 用户授予的。
三、postgresql数据库级别的参数如何设置
(一)设置方法
postgresql是参数设置分为实例级、数据库级、用户级和会话级,而有些参数可以在所有级别中设置,优先级顺序为会话级>用户级>数据库级>实例级。
数据库参数配置语法:
ALTER DATABASE 名称 SET 配置参数 {TO|=} {值|DEFAULT}
ALTER DATABASE 名称 SET 配置参数 FROM CURRENT
ALTER DATABASE 名称 RESET 配置参数
ALTER DATABASE 名称 RESET ALL
(二)设置示例
1、设置数据库搜索路径:
alter database postgres set search_path to "$user", public, schema_name;
设置模式搜索路径
postgres=# alter database postgres set search_path to "$user",public,u1_s1;
ALTER DATABASE
postgres=# show search_path;search_path
-----------------"$user", public
(1 row)设置完要exit退出再重新连进来才生效。
postgres=# exit
[postgres@db /var/postgre/data]$psql
psql (16.0)
Type "help" for help.postgres=# show search_path;search_path
------------------------"$user", public, u1_s1
(1 row)postgres=# \dtList of relationsSchema | Name | Type | Owner
--------+----------+-------+----------public | t0102 | table | postgrespublic | test | table | r11public | test_con | table | postgrespublic | tt | table | postgresu1_s1 | test1 | table | u3u1_s1 | test2 | table | u3u1_s1 | test3 | table | u3
(7 rows)postgres=#
27min