一、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=# \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=#
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 unexpectedlyThis probably means the server terminated abnormallybefore 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=# \drdsList of settingsRole | 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 | -1template0 | -1pubdb | -1pubdb1 | -1u3_db | -1newdb1 | -1postgres | -1
(7 rows)u3_db=#
-1表示沒有限制。
四、PostgreSQl數據庫屬性修改
數據庫的屬性我們可以進行修改,修改范圍是數據庫名字、屬主、表空間。
(一)修改數據庫的名稱
ALTER DATABASE 名稱 RENAME TO 新的名稱
(二)修改數據庫的屬主
ALTER DATABASE 名稱 OWNER TO {新的屬主|CURRENT USERISESSION_USER}
(三)修改數據庫到新的表空間
ALTER DATABASE 名稱 SET TABLESPACE 新的表空間