应用场景:
(1)用户在PostGIS插件过程中,没有选中单选框Create Spatial Database或想自己按需求建设自己的PostGIS原生库。
(2)按自己定义的用户角色实施PostGIS空间库SQL级别的权限权限管理(会话级别的权限控制,通过pg_hba.conf来设置)。
(3)兼容Arcgis Desktop对PostGIS空间表的导入、新建等操作。
前置条件:
PostgreSQL(9.5)、postgis(2.3.7)、postgis_topology(2.3.7)等空间插件,以及pgAdmin(1.22)软件。
Arcgis Desktop(10.5), 一个shapefile数据。
前期数据库规划(1.0):
PostGIS空间库:db01
角色组:
db01owner db01拥有者组,创建删除db01中的对象,包括schema、table等
db01readergroup db01读取角色组,可读取db01中的对象,包括schema、table、序列等
db01writergroup db01 编辑角色组,不能新建数据对象,但可对db01数据库中的表进行编辑。
登陆角色:
dbadmin 超级管理员
db01 db01数据库拥有者登陆角色,继承db01owner;
db01reader db01数据库读用户,继承db01readergroup
db01writer db01数据库写用户,继承db01writergroup
在实施的过程中存在以下问题
Arcgis desktop10.5 问题:
- 连接带有的数据库名称有大写字符时 报错:无效数据库名称。
- 用户名不能有“_”不识别
- 在使用arcgis 操作postgis数据库时,必须有与连接用户名同名的模式(schema),创建的表等,默认都在这个模式中
- 在使用arcgis 操作postgis数据库时,通过catalog创建的表,表的所有者必须是当前用户,如果将表的所有者改成当前用户的父类(用户组)也报错:编辑对象失败或未找到dbms表。
pgAdmin的问题:
- 登陆角色之间不能进行继承。
- 在设置对新建表,赋予默认权限时,具有创建表权限的角色都要配置一边,要不只有配置过的角色创建的新表,才会具有默认权限(db01readergroup)
最终优化数据库规划(1.1):
角色组:
db01readergroup db01读取角色组,可读取db01中的对象,包括schema、table、序列等
db01writergroup db01 编辑角色组,不能新建数据对象,但可对db01数据库中的表进行编辑。
登陆角色:
dbadmin 超级管理员
db01 db01数据库拥有者登陆角色,继承db01owner;
db01reader db01数据库读用户,继承db01readergroup
db01writer db01数据库写用户,继承db01writergroup
备注:后期增加只读用户时只需继承角色db01readergroup,增加编辑用户时只需继承db01readergroup和db01writergroup角色。数据库故障可根据登陆用户去跟踪故障。
最终效果:
用到的命令:
create database db01 with encoding='utf8' owner=db01;
\dn+
\c db01 db01;
Create schema db01;
\c db01 dbadmin;
Create extension postgis;
Create extension postgis_topology;
grant usage on schema db01,public,topology to dbo1readergroup;
Grant select on all tables in schema db01,public,topology to db01readergroup;
Alter default privileges for user dbadmin,db01,db01writergroup in schema db01,public,topology grant select on tables to db01readergroup;
编辑角色组的设置,参考读取角色组的设置
实施操作过程
select * from pg_user 查看所有用户;
select * from pg_tables 得到当前db中所有表的信息
对dbadmin、db01、db三个角色在模式(schema)中新建表,自动赋予角色db01readergroup的读权限(select)
Alter default privileges for user dbadmin,db01,db01writergroup in schema db01,public,topology grant select on tables to db01readergroup;