PostgreSQL9.5:Allow CREATE/ALTER DATABASE to manipulate datistemplate and datallowconn

pg_database 系统表展现了数据库信息,例如数据库名称,字符集,是否是模板库(datistemplate),是否允许连接(datallowconn)等信息。系统表在绝大多数情况下是不建议修改的,因为万一带来不可控的影响就悲剧了。 datistemplate 和 datallowconn 属性在之前版不支持数据库命令操作,如果要修改只能通过更新 pg_database 系统表的形式,9.5 版本则支持 ALTER DATABASE 命令设置这两个属性,下面演示下。

pg_database 系统表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[pg95@db2 ~]$ psql   
psql (9.5alpha1)
Type "help" for help.

postgres=# /d pg_database
Table "pg_catalog.pg_database"
Column | Type | Modifiers
---------------+-----------+-----------
datname | name | not null
datdba | oid | not null
encoding | integer | not null
datcollate | name | not null
datctype | name | not null
datistemplate | boolean | not null
datallowconn | boolean | not null
datconnlimit | integer | not null
datlastsysoid | oid | not null
datfrozenxid | xid | not null
datminmxid | xid | not null
dattablespace | oid | not null
datacl | aclitem[] |
Indexes:
"pg_database_datname_index" UNIQUE, btree (datname), tablespace "pg_global"
"pg_database_oid_index" UNIQUE, btree (oid), tablespace "pg_global"
Tablespace: "pg_global"

查看数据库 datistemplate, datallowconn 属性

1
2
3
4
5
6
7
8
postgres=# select datname,encoding,datistemplate,datallowconn from pg_database;  
datname | encoding | datistemplate | datallowconn
-----------+----------+---------------+--------------
template1 | 6 | t | t
template0 | 6 | t | f
postgres | 6 | f | t
fdb | 6 | f | t
(4 rows)

设置数据库 datistemplate 属性

修改 fdb 数据库 datistemplate 属性,将它设置成 t

1
2
3
4
5
6
7
8
9
10
11
postgres=# alter database fdb IS_TEMPLATE true;  
ALTER DATABASE

postgres=# select datname,encoding,datistemplate,datallowconn from pg_database;
datname | encoding | datistemplate | datallowconn
-----------+----------+---------------+--------------
template1 | 6 | t | t
template0 | 6 | t | f
postgres | 6 | f | t
fdb | 6 | t | t
(4 rows)

备注: fdb 库的 datistemplate 值变成 t 了。

设置数据库 datallowconn 属性

修改 fdb 数据库 datallowconn 属性,将它设置成 f

1
2
3
4
5
6
7
8
9
10
11
postgres=# alter database fdb ALLOW_CONNECTIONS false;  
ALTER DATABASE

postgres=# select datname,encoding,datistemplate,datallowconn from pg_database;
datname | encoding | datistemplate | datallowconn
-----------+----------+---------------+--------------
template1 | 6 | t | t
template0 | 6 | t | f
postgres | 6 | f | t
fdb | 6 | t | f
(4 rows)

备注: fdb 库的 datallowconn 值变成 f 了。

另开一会话:尝试连接 fdb 库

1
2
[pg95@db2 ~]$ psql fdb fdb  
psql: FATAL:database "fdb" is not currently accepting connections

备注:报错,不允许连接 fdb 库;这个特性在数据库某些维护场景下特别有用。之前的方法一般是通过更改防火墙或数据库的 pg_hba.conf 策略来达到这个目标。

参考

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/239641.html

(0)
上一篇 2022年2月12日
下一篇 2022年2月12日

相关推荐

发表回复

登录后才能评论