百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

PostgreSQL用户与角色

toyiye 2024-06-21 12:23 10 浏览 0 评论

用户和角色

PostgreSQL使用角色的概念管理数据库访问权限。角色时一系列相关权限的集合。为了管理方便,通常会把一系列相关的数据库权限赋给一个角色,如果哪个用户需要这些权限,就把角色赋给相应的用户。由于用户也拥有一系列的相关权限,为了简化管理,在PostgreSQL中,角色与用户时没有区别的,一个用户也是角色,我们可以把一个用户的权限赋给另一个用户。

用户和角色在整个数据库实例中都是全局的,且在同一个实例中的不同数据库中,看到的用户也都是相同的。

在初始化数据库系统时,有一个预定义的超级用户,这个用户的名称与初始化该数据库的操作系统用户名相同。如果数据库是建在操作系统用户postgres,这个数据库超级用户的名称也会叫"postgres"。可以用这个超级用户连接数据库,然后创建出更多的用户。

创建用户和角色

 CREATE ROLE name [ [ WITH ] option [ ... ] ]
 CREATE USER name [ [ WITH ] option [ ... ] ]
 
 where option can be:
     
       SUPERUSER | NOSUPERUSER    超级用户
     | CREATEDB | NOCREATEDB      建库权限
     | CREATEROLE | NOCREATEROLE  创建角色权限
     | CREATEUSER | NOCREATEUSER  创建用户权限
     | INHERIT | NOINHERIT        继承权限
     | LOGIN | NOLOGIN            登陆权限
     | CONNECTION LIMIT connlimit  指定用户可以使用的并发连接数量
     | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'  密码是否加密
     | VALID UNTIL 'timestamp'     密码失效时间
     | IN ROLE rolename [, ...]    指定用户成为哪些角色的成员
     | IN GROUP rolename [, ...]
     | ROLE rolename [, ...]       role_name将成为这个新建的角色的成员
     | ADMIN rolename [, ...]      
     | USER rolename [, ...]
     | SYSID uid 

在PostgreSQL中,用户与角色是没有区别的。除了"CREATE USER"默认创建出来的用户有"LOGIN"权限,而"CREATE ROLE"创建出来的用户没有"LOGIN"权限之外,没有其他任何区别。

权限的管理

在PostgreSQL数据库中,每个数据库的逻辑结构对象(包括数据库)都有一个所有者,也就是说任何数据库对象都是属于某个用户的,所有者默认就拥有所有权限。

所以不需要把对象的权限再赋给所有者。自己创建的数据库,自己当然有全部的权限。当然,所有者处于安全考虑也可以选择废弃一些自己的权限。在PostgreSQL数据库中,删除一个对象及任意修改它的权限都不能赋予别人,它是所有者固有的,不能被赋予或撤销。

一个用户的权限分为两类,一类是在创建用户时就指定的权限,这些权限如下:

  • 超级用户的权限
  • 创建用户的权限
  • 是否允许LOGIN的权限

这些权限是创建用户时指定的,后面可使用ALTER ROLE来修改。

还有一类权限,是由命令GRANT和REVOKE来管理的,这些权限如下:

  • 在数据库中创建模式(SCHEMA)
  • 允许在指定的数据库中创建临时表
  • 连接某个数据库
  • 在模式中创建数据库对象,如创建表、视图、函数等
  • 在一些表中做SELECT、UPDATE、INSERT、DELETE操作等
  • 在一张表的具体列上进行SELECT、UPDATE、INSERT操作
  • 对序列进行查询(执行序列的currval函数)、使用(执行序列的currval函数和nextval函数)、更新等操作
  • 在声明表上创建触发器
  • 可以把表、索引等建到指定的表空间

在使用时,需要分清楚上述两类权限,如果要给用户赋予创建数据库的权限,则需要使用"ALTER ROLE"命令。

如果要给用户赋予创建模式的权限时,需要使用"GRANT"命令

 ALTER ROLE 格式
 ALTER ROLE name [ [ WITH ] option [ ... ] ]
 
 修改角色的密码
 ALTER ROLE davide WITH PASSWORD 'hu8jmn3';
 
 修改角色密码过期时间
 ALTER ROLE chris VALID UNTIL 'May 4 12:00:00 2015 +1';
 
 修改密码永不过期
 ALTER ROLE fred VALID UNTIL 'infinity';
 
 赋予创建数据库创建角色权限
 ALTER ROLE miriam CREATEROLE CREATEDB;
 
 给角色设置参数
 ALTER ROLE worker_bee SET maintenance_work_mem = 100000;

GRANT命令有两个作用,一个是让某个用户成为某个角色成员,从而使其拥有角色的权限:

 GRANT role [, ...] TO username [, ...] [ WITH ADMIN OPTION ]

另一个作用是把某些数据库逻辑结构对象的操作权限赋予某个用户(或角色)

 GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
     [,...] | ALL [ PRIVILEGES ] }
     ON [ TABLE ] tablename [, ...]
     TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
 
 GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
     ON DATABASE dbname [, ...]
     TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
 
 GRANT { EXECUTE | ALL [ PRIVILEGES ] }
     ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]
     TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
 
 GRANT { USAGE | ALL [ PRIVILEGES ] }
     ON LANGUAGE langname [, ...]
     TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
 
 GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
     ON SCHEMA schemaname [, ...]
     TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]
 
 GRANT { CREATE | ALL [ PRIVILEGES ] }
     ON TABLESPACE tablespacename [, ...]
     TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

创建一个只读用户

 REVOKE CREATE ON SCHEMA public from public;
 这是因为PostgreSQL中默认任何用户都可以在名称为public的schema中创建表,而只读用户是不允许建表的,所以先要把这个权限收回。
 
 创建一个readonly用户
 CREATE USER readonly with password 'query';
 
 把public schema下的所有表的SELECT权限赋给用户readonly
 GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
 
 上面命令只是把现有表的权限给了用户readonly,如果此时创建了表,readonly用户还是不能读,需要使用下面的SQL把所建表的SELECT权限也给用户readonly
 ALTER DEFAULT PRIVILEGES IN SCHEMA public grant select on tables to readonly;
 
 注意,上面的过程只是给schema下的名为public表赋予了只读权限,如果想让用户访问其他schema下的表,执行下面SQL
 GRANT SELECT ON ALL TABLES IN SCHEMA other_schema TO readonly;
 ALTER DEFAULT PRIVILEGES IN SCHEMA other_schema grant select on tables to readonly;



相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码