一、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 db_name 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=# \dt
List of relations
Schema | Name | Type | Owner
--------+----------+-------+----------
public | t0102 | table | postgres
public | test | table | r11
public | test_con | table | postgres
public | tt | table | postgres
u1_s1 | test1 | table | u3
u1_s1 | test2 | table | u3
u1_s1 | test3 | table | u3
(7 rows)
postgres=#
2、配置连接某个库时可使用的工作内存
alter database db_name set work_mem ='8MB';
设置的是连接到这个数据库时给这个用户分配的内存
3、配置连接某个库时可使用的维护内存
alter database db_name set maintenance_work_mem TO '256MB';
4、配置连接某个库后使用的时区
alter database db_name set TimeZone to cet;
alter database db_name set DateStyle to SQL, DMY;(重新登录生效)
5、配置连接某个库后执行语句最多时长(执行1秒超时)
alter database db_name set statement_timeout =1000;
6、配置连接某个库后默认的客户端编码,配置客户端编码为gbk,适用于数据库编码
为utf8,应用程序编码为gbk的应用
alter database db_name set client_encoding to gbk;
7、配置某个库使用日志记录级别(设置后,对这个数据库的访问不记录日志)
alter database db_name set log statement=none;
8、配置连接某个库后的wal日志写盘级别设置后,该库的更新操作只要求本地提交)
alter database db_name set synchronous_commit to local;
9、配置连接某个库后禁用某个规划器(禁用indexonlyscan扫描)
alter database db_name set enable_indexonlyscan to off;
10.配置连接某个库后执行出错时中断连接(对新会话生效)
alter database db_name set exit_on_error to on;
--重新连接后
select pg_backend_pid();
postgres=# alter database u3_db set exit_on_error to on;
ALTER DATABASE
postgres=# exit
[postgres@db /var/postgre/data]$psql -d u3_db
psql (16.0)
Type "help" for help.
返回当前连接到数据库的会话所对应的后端进程的进程 ID(PID)
u3_db=# select pg_backend_pid();
pg_backend_pid
----------------
4615
(1 row)
u3_db=# create table kil;
FATAL: syntax error at or near ";"
LINE 1: create table kil;
^
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
u3_db=# select pg_backend_pid();
返回当前连接到数据库的会话所对应的后端进程的进程 ID(PID),可以看到进程已经变了
pg_backend_pid
----------------
4704
(1 row)
u3_db=#
10、设置为默认值
--设置某个个性化设置为默认值
ALTER DATABASE db_name reset exit_on_error;
--设置所有个性化设置为默认值
ALTER DATABASE db_name reset ALL;
(三)查看个性化设置
1、查看所有个性化配置
\drds
u3_db=# \drds
List of settings
Role | Database | Settings
------+----------+------------------------------------
| postgres | search_path="$user", public, u1_s1
| u3_db | exit_on_error=on
(2 rows)
u3_db=#
2、查询数据库的连接数限制只能查看数据字典表
select datname,datconnlimit from pg_database;
连接数限制的设置可以在实例级别,也可以在数据库级别
u3_db=# select datname,datconnlimit from pg_database;
datname | datconnlimit
-----------+--------------
template1 | -1
template0 | -1
pubdb | -1
pubdb1 | -1
u3_db | -1
newdb1 | -1
postgres | -1
(7 rows)
u3_db=#
-1表示没有限制。
四、PostgreSQl数据库属性修改
数据库的属性我们可以进行修改,修改范围是数据库名字、属主、表空间。
(一)修改数据库的名称
ALTER DATABASE 名称 RENAME TO 新的名称
(二)修改数据库的属主
ALTER DATABASE 名称 OWNER TO {新的属主|CURRENT USERISESSION_USER}
(三)修改数据库到新的表空间
ALTER DATABASE 名称 SET TABLESPACE 新的表空间