基于PostgreSQL 权限解读

1 public权限解读

用户默认情况下具有public权限,public默认具有创建和使用schema的权限,因此意味着可以在schema中创建对象(包括表)、列出schema中的对象,并在其权限允许时访问它们。

所以创建数据库或schema完成后做的第一件事是

1.1 创建数据库完成后

--回收schema的public权限
--revoke all on schema public from public; --正常情况使用这个
revoke all on schema public,tiger,tiger_data,topology from public; --使用postgis扩展使用这个
--从core数据库收回public的所有权限
revoke all on database core from public;
revoke all on database postgres from public;
--重新将schema授予数据库所有者
grant all on schema public,tiger,tiger_data,topology to 数据库所有者;

1.2 创建schema完成后

create schema history;
revoke all on schema history from public;
--重新将schema history授予数据库所有者
grant all on schema history to 数据库所有者;

2 测试

假设现在有一数据库core.

2.1 postgrese用户连接至core数据库

psql -h localhost -p 5432 -U postgres -d core
--创建一个名称sel的用户
create user sel with nosuperuser nocreatedb nocreaterole noinherit login noreplication nobypassrls password '123';
--允许连接至数据库core
grant connect on database core to sel;

--查看角色使用\duS+
\duS+
--或
\duS+ sel

--查看用户在schema的权限
\dp

--查看数据库的用户
\l+

权限解释:

r -- SELECT ("读")
w -- UPDATE ("写")
a -- INSERT ("追加")
d -- DELETE
D -- TRUNCATE
x -- REFERENCES
t -- TRIGGER
X -- EXECUTE
U -- USAGE
C -- CREATE
c -- CONNECT
T -- TEMPORARY
arwdDxt -- ALL PRIVILEGES (对于表,对其他对象会变化)
* -- 用于前述特权的授权选项

2.2 在另一个进程中运行

psql -h localhost -p 5432 -U sel -d core
drop table aaa;
create table aaa(
 objectid integer
);
select * from features;

上面的sql报

ERROR: table "aaa" does not exist
ERROR: no schema has been selected to create in
ERROR: relation "features" does not exist

2.3 用postgrese用户登录core数据库为sel用户授权

psql -h localhost -p 5432 -U postgres -d core

您需要什么权限就授予什么权限,这里授予sel用户可以select public schema下的所有对象。

grant usage on schema public to sel;
grant select on all tables in schema public to sel;

2.4 再次转到在另一个进程中运行

psql -h localhost -p 5432 -U sel -d core
select * from features;
delete from features;

现在已经可以正常查询数据了,但是此用户只有查询权限。

3 删除用户

3.1 使用postgrese用户连接至core数据库

注意你授予用户什么权限必须在drop用户前先revoke,然后再删除,否则报依赖错。所以授权文件保存好以便将来删除用户,不然查询关联性非常麻烦。

psql -h localhost -p 5432 -U postgres -d core
--回收分配的权限并删除用户
revoke select on all tables in schema public from sel;
revoke usage on schema public from sel;
revoke connect on database core from sel;
drop role sel;

补充:PostgreSQL 用户和权限管理

默认用户

postgres安装完成后,会自动在操作系统和postgres数据库中分别创建一个名为postgres的用户以及一个同样名为postgres的数据库。

登录

方式1:指定参数登录

psql -U username -d database_name -h host -W

参数含义: -U指定用户 -d要连接的数据库 -h要连接的主机 -W提示输入密码。

方式2:切换到postgres同名用户后登录

su username
psql

当不指定参数时psql使用操作系统当前用户的用户名作为postgres的登录用户名和要连接的数据库名。所以在PostgreSQL安装完成后可以通过以上方式登录。

创建用户

方式1:在系统命令行中使用createuser命令中创建

createuser username 

方式2:在PostgresSQL命令行中使用CREATE ROLE指令创建

CREATE ROLE rolename;

方式3:在PostgresSQL命令行中使用CREATE USER指令创建

CREATE USER username;

CREATE USER和CREATE ROLE的区别在于,CREATE USER指令创建的用户默认是有登录权限的,而CREATE ROLE没有。

\du 指令显示用户和用户的用户属性

创建用户时设定用户属性

基本语法格式

CREATE ROLE role_name WITH optional_permissions;

示例:在创建用户时设定登录权限。

CREATE ROLE username WITH LOGIN;

可以通过\h CREATE ROLE指令查看全部可设置的管理权限

修改用户属性

修改权限的命令格式

ALTER ROLE username WITH attribute_options;

例如:可通过以下方式禁止用户登录

ALTER ROLE username WITH NOLOGIN;

设置访问权限

语法格式如下:

GRANT permission_type ON table_name TO role_name;

实例:

GRANT UPDATE ON demo TO demo_role; --赋予demo_role demo表的update权限
GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC to demo_role; --赋予demo_role所有表的SELECT权限

特殊符号:ALL代表所访问权限,PUBLIC代表所有用户

GRANT ALL ON demo TO demo_role; --赋给用户所有权限
GRANT SELECT ON demo TO PUBLIC; --将SELECT权限赋给所有用户

\z或\dp指令显示用户访问权限。

\h GRANT显示所有可设置的访问权限

撤销用户访问权限

语法格式如下:

REVOKE permission_type ON table_name FROM user_name;

其中permission_type和table_name含义与GRANT指令中相同。

用户组

在postgres中用户实际上是role,同时组也是role。 包含其他role的role就是组。

创建组示例:

CREATE ROLE temporary_users;
GRANT temporary_users TO demo_role;
GRANT temporary_users TO test_user;

切换ROLE

SET ROLE role_name; --切换到role_name用户
RESET ROLE; --切换回最初的role

INHERIT权限:该属性使组成员拥有组的所有权限

ALTER ROLE test_user INHERIT;

删除用户和组

删除用户和组很简单:

DROP ROLE role_name;
DROP ROLE IF EXISTS role_name;

删除组role只会删除组的role本身,组的成员并不会被删除。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 浅谈PostgreSQL消耗的内存计算方法

    wal_buffers默认值为-1,此时wal_buffers使用的是shared_buffers,wal_buffers大小为shared_buffers的1/32 autovacuum_work_mem默认值为-1,此时使用maintenance_work_mem的值 1 不使用wal_buffers.autovacuum_work_mem 计算公式为: max_connections*work_mem + max_connections*temp_buffers +shared_buffe

  • 查看postgresql系统信息的常用命令操作

    1.查看当前数据库实例版本. postgres=# select version(); version ----------------------------------------------------------------------------------------------------------- PostgreSQL 9.3.0 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Ha

  • postgresql 启动与停止操作

    启动和停止数据库服务器 service 方式 service postgresql-10 start service postgresql-10 stop service postgresql-10 status pg_ctl 方式 pg_ctl start -D [ data 所在路径 ] pg_ctl stop -D [ data 所在路径 ] 三种形式:-m 指定模式 smart 模式:会等待活动的事务提交结束,并等待客户端主动断开连接之后关闭数据库服务 fast 模式:会回滚所有的活动的

  • 快速解决PostgreSQL中的Permission denied问题

    想开始学习SQL和Excel那本书,觉得自己亲手去输入才是正道.发现程序后续会用到窗口函数,可是我的mysql没有窗口函数,这本书所提供的数据脚本分别是MS SQL Sever和PostreSQL. 上午我先安装的sql sever,可是由于比较大且在安装时出现了一些小的问题(安装缓慢,服务启动不了).无奈选择了PostreSQL,体积小,安装顺利. 导入数据比较特别,先建一个表,然后把同名txt导入进去.一定要用unix方式的路径. copy这个语句先前在mysql上没有遇到过.学习下....

  • 使用Postgresql 实现快速插入测试数据

    1.创建常规的企业信息表 create table t_centerprises( objectid bigint not null, /*唯一编号(6位行政区号+6位sn)*/ divid uuid not null, /*行政区唯一代码*/ name text not null, /*企业名称*/ address text not null, /*企业地址*/ post text, /*企业邮编*/ contacts text, /*联系人*/ tel text, /*联系电话*/ fax

  • 查询PostgreSQL占多大内存的操作

    我就废话不多说了,大家还是直接看代码吧~ select pg_size_pretty(pg_relation_size('cuiyonghua.top_iqiyi_info')); select pg_size_pretty(pg_relation_size('cuiyonghua.top_mgtv_info')); select pg_size_pretty(pg_relation_size('cuiyonghua.top_tencent_info')); select pg_size_pre

  • PostgreSQL查看版本信息的操作

    1.查看客户端版本 psql --version 2.查看服务器端版本 2.1 查看详细信息 select version(); 2.2 查看版本信息 show server_version; 2.2 查看数字版本信息包括小版号 SHOW server_version_num; 或 SELECT current_setting('server_version_num'); 3.注意事项 SELECT current_setting('server_version_num');返回类型为text,

  • PostgreSQL的generate_series()函数的用法说明

    我就废话不多说了,大家还是直接看代码吧~ SELECT generate_series(1,12) AS month; SELECT generate_series(1,12,1) AS month; SELECT generate_series('2020-01-01'::DATE,'2020-12-31'::DATE,'1 month'::INTERVAL) AS first_of_month; 补充:PostgreSQL使用generate_series函数 填充数据(插入数据) sele

  • 基于PostgreSQL 权限解读

    1 public权限解读 用户默认情况下具有public权限,public默认具有创建和使用schema的权限,因此意味着可以在schema中创建对象(包括表).列出schema中的对象,并在其权限允许时访问它们. 所以创建数据库或schema完成后做的第一件事是 1.1 创建数据库完成后 --回收schema的public权限 --revoke all on schema public from public; --正常情况使用这个 revoke all on schema public,ti

  • 基于PostgreSQL/openGauss 的分布式数据库解决方案

    在 MySQL ShardingSphere-Proxy 逐渐成熟并被广泛采用的同时,ShardingSphere 团队也在 PostgreSQL ShardingSphere-Proxy 上持续发力.相比前期的 alpha 与 beta,5.0.0 正式版对 PostgreSQL 的协议实现.SQL 支持度.权限控制等方面进行了大量的完善,为后续全面对接 PostgreSQL 生态打下基础.ShardingSphere-Proxy 与 PostgreSQL 的生态对接,让用户能够在 Postg

  • ThinkPHP的RBAC(基于角色权限控制)深入解析

    一.什么是RBAC基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色.角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收.角色与角色的关系可以

  • 基于PostgreSQL和mysql数据类型对比兼容

    1.数值类型 整数: mysql中的整数类型和pg相比,两者有以下区别: mysql:mysql中支持int 1,2,3,4,8 字节,同时支持有符号,无符号.并且mysql中支持在数值列中指定zerofill,用来将存储的数值通过填充0的方式达到指定数据类型的长度(mysql8开始不建议使用ZEROFILL属性,并且在将来的MySQL版本中将不再支持该属性). pg:pg支持 int 2,4,8 字节,且数值都是有符号的. mysql整数类型: pg整数类型: 那么对于mysql中的1,3字节

  • 基于PostgreSQL密码重置操作

    今天我在用命令行登陆postgresql的时候,忽然忘记密码了,重试了N次还是不行,然后我就试着上网找解决之道,最后完美的解决了,可是后来我才发现还有个更简单的方法,该篇博客用来记录自己沙雕行为. 工具已登陆 这个就是最简单的方法,你有工具登陆过,完全可以通过工具来修改(可是我当时完全没想到这个...),我是通过Navicat来连接的,可以直接通过Navicat来修改步骤如下: 1.连接数据库 2.点击角色 3.选择角色 4.填入新密码 5.保存之后,关闭连接,编辑连接就OK了. 工具未登录 W

  • 基于php权限分配的实现代码

    小编今天写下关于后台管理员权限的分配自己的思路想法 复制代码 代码如下: <?php /**reader * 小编的思想比较简单实现的功能 * 首先每个栏目的id号是固定不变的 然后 总管理员 * 创建个管理员之后 给该管理员分配权限的时候  把相应的栏目勾选上 * 这样把栏目的 id 号 就插入到数据库里面了,当这个管理员登录之后 * 获得这个管理员 应有的的栏目id 号 .左边的导航 根据当前的栏目id在不在该管理员的  * 栏目id号里 来判断显示或者不显示呢.. */ header(&quo

  • 基于postgresql数据库锁表问题的解决

    查询是否锁表了 select oid from pg_class where relname='可能锁表了的表' select pid from pg_locks where relation='上面查出的oid' 如果查询到了结果,表示该表被锁 则需要释放锁定 select pg_cancel_backend(上面查到的pid) 补充:PostgreSQL 解决锁表.死锁问题 1.-- 查询ACTIVITY的状态等信息 SELECT T .PID, T.STATE, T.QUERY, T.WA

  • 基于postgresql行级锁for update测试

    创建表: CREATE TABLE db_user ( id character varying(50) NOT NULL, age integer, name character varying(100), roleid character varying, CONSTRAINT db_user_pkey PRIMARY KEY (id) ) 随便插入几条数据即可. 一.不加锁演示 1.打开一个postgreSQL的SQL Shell或pgAdmin的SQL编辑器窗口,执行: begin; s

  • 基于PostgreSQL pg_hba.conf 配置参数的使用说明

    pg_hba.conf 配置详解 该文件位于初始化安装的数据库目录下 编辑 pg_hba.conf 配置文件 postgres@clw-db1:/pgdata/9.6/poc/data> vi pg_hba.conf TYPE 参数设置 TYPE 表示主机类型,值可能为: 若为 `local` 表示是unix-domain的socket连接, 若为 `host` 是TCP/IP socket 若为 `hostssl` 是SSL加密的TCP/IP socket DATABASE 参数设置 DATA

  • 基于postgresql查询某个字段属于哪个表的说明

    一.场景还原 前端小林问我,它从前端的返回的某些字段,想知道那个表有这个字段,它想操作这个表-- 二.sql语句 SELECT * FROM information_schema. COLUMNS WHERE COLUMN_NAME = 'storename'; SELECT c.relname AS "表名",a.attname AS "字段名",c.oid FROM pg_class c LEFT JOIN pg_attribute a ON a.attreli

随机推荐