PostgreSQL角色迁移原理简述

概述

本文描述PostgreSQL角色迁移的流程,基于该方案可通过Java、Python等语言开发PostgreSQL角色迁移工具。

使用pg_dumpall导出角色

通过PostgreSQL数据库提供的pg_dumpall命令可以导出roles定义。

$ pg_dumpall --roles only
CREATE ROLE test_role;
ALTER ROLE test_role WITH NOSUPERUSER INHERIT CREATEROLE CREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'md5aba4a945c8d93f0f2b8e49558964fe4e';

pg_dumpall导出角色原理

pg_dumpall主要是调用了代码文件pg_dumall.c中函数dumpRoles。该函数主要执行两个步骤,先是查询角色的相关数据,然后将数据拼凑成角色的SQL定义语句。此处不对拼凑SQL定义语句部分做分析,仅分析查询角色的部分。

if (server_version >= 90600)printfPQExpBuffer(buf,"SELECT oid, rolname, rolsuper, rolinherit, ""rolcreaterole, rolcreatedb, ""rolcanlogin, rolconnlimit, rolpassword, ""rolvaliduntil, rolreplication, rolbypassrls, ""pg_catalog.shobj_description(oid, '%s') as rolcomment, ""rolname = current_user AS is_current_user ""FROM %s ""WHERE rolname !~ '^pg_' ""ORDER BY 2", role_catalog, role_catalog);else if (server_version >= 90500)printfPQExpBuffer(buf,"SELECT oid, rolname, rolsuper, rolinherit, ""rolcreaterole, rolcreatedb, ""rolcanlogin, rolconnlimit, rolpassword, ""rolvaliduntil, rolreplication, rolbypassrls, ""pg_catalog.shobj_description(oid, '%s') as rolcomment, ""rolname = current_user AS is_current_user ""FROM %s ""ORDER BY 2", role_catalog, role_catalog);elseprintfPQExpBuffer(buf,"SELECT oid, rolname, rolsuper, rolinherit, ""rolcreaterole, rolcreatedb, ""rolcanlogin, rolconnlimit, rolpassword, ""rolvaliduntil, rolreplication, ""false as rolbypassrls, ""pg_catalog.shobj_description(oid, '%s') as rolcomment, ""rolname = current_user AS is_current_user ""FROM %s ""ORDER BY 2", role_catalog, role_catalog);

根据源码中显示,PostgreSQL会根据版本不同,执行不同的查询语句,表名通过role_catelog传入。
通过源代码追溯pg_dumall.c中函数main函数中对变量role_catelog进行了赋值

#define PG_AUTHID "pg_authid"
#define PG_ROLES  "pg_roles "if (no_role_passwords)sprintf(role_catalog, "%s", PG_ROLES);elsesprintf(role_catalog, "%s", PG_AUTHID);

如果不需要导出角色的密码,查询视图pg_roles;如果要导出角色密码,查询表pg_authid
通过上述代码分析,可得出只要查询pg_roles或`pg_authid,即可获取到角色的信息,从而用于角色的SQL定义拼凑。

pg_roles视图详解

视图字段说明
列名列类型描述
rolnamename角色名。
rolsuperbool角色具有超级用户权限。
rolinheritbool如果此角色是另一个角色的成员,角色能自动继承另一个角色的权限。
rolcreaterolebool角色能创建更多角色。
rolcreatedbbool角色能创建数据库。
rolcanloginbool角色是否能登录。即该角色是否能够作为初始会话授权标识符。
rolreplicationbool角色是一个复制角色。复制角色可以开启复制连接并且创建和删除复制槽。
rolconnlimitint4对于一个可登录的角色,这里设置角色可以发起的最大并发连接数。-1表示无限制。
rolpasswordtext不显示密码,一直显示********。
rolvaliduntiltimestamptz口令失效时间(只用于口令认证),如果永不失效则为空
rolbypassrlsbool绕过每一条行级安全性策略的角色。
rolconfigtext[]运行时配置变量的角色特定默认值。
oidoid角色的ID。
视图定义说明

通过PostgreSQL源代码中的system_views.sql文件可知,该视图是表pg_authid的一个公共可读视图,隐去了密码字段。

CREATE VIEW pg_roles ASSELECTrolname,rolsuper,rolinherit,rolcreaterole,rolcreatedb,rolcanlogin,rolreplication,rolconnlimit,'********'::text as rolpassword,rolvaliduntil,rolbypassrls,setconfig as rolconfig,pg_authid.oidFROM pg_authid LEFT JOIN pg_db_role_setting sON (pg_authid.oid = setrole AND setdatabase = 0);

pg_authid表详解

  • pg_authid包含关于数据库授权标识符(角色)的信息。
  • 对于一个MD5加密的口令,rolpassword列将由字符串md5后面跟上一个 32 字符的十六进制 MD5 哈希值构成。MD5 哈希值将是该用户的口令串接上它们的用户名。
列名列类型描述
rolnamename角色名。
rolsuperbool角色具有超级用户权限。
rolinheritbool如果此角色是另一个角色的成员,角色能自动继承另一个角色的权限。
rolcreaterolebool角色能创建更多角色。
rolcreatedbbool角色能创建数据库。
rolcanloginbool角色是否能登录。即该角色是否能够作为初始会话授权标识符。
rolreplicationbool角色是一个复制角色。复制角色可以开启复制连接并且创建和删除复制槽。
rolconnlimitint4对于一个可登录的角色,这里设置角色可以发起的最大并发连接数。-1表示无限制。
rolpasswordtext密码(可能被加密过),如果没有口令则为空。格式取决于使用的加密方法的形式。
rolvaliduntiltimestamptz口令失效时间(只用于口令认证),如果永不失效则为空
rolbypassrlsbool绕过每一条行级安全性策略的角色。
rolconfigtext[]运行时配置变量的角色特定默认值。
oidoid角色的ID。

PostgreSQL角色迁移方案

综上所述,PostgreSQL角色迁移就是通过查询表pg_authid获取到角色的属性、密码等信息,从而拼凑SQL,就可以进行角色迁移。迁移的方式有以下两种:

参照pg_dumpall的方式拼凑SQL

create role xxx;
alter role xxx with xxx  xxxx xxx password 'xxxx';

生成INSERT语句,将角色直接插入到pg_authid

  • 需要注意主键冲突;
  • 由于PostgreSQL的角色密码中包含角色名,因此无法实现角色名映射迁移。
INSERT INTO "pg_authid" ( "oid", "rolname", "rolsuper", "rolinherit", "rolcreaterole", "rolcreatedb", "rolcanlogin", "rolreplication", "rolbypassrls", "rolconnlimit", "rolpassword", "rolvaliduntil" )
VALUES( 36020125, 'db_user', 'f', 't', 'f', 'f', 't', 'f', 'f', - 1, 'md52957e9728db56f59bbedbb586f6224f0', NULL );

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试之Springboot应用

测试之Spring Boot应用 在软件开发过程中,测试是确保代码质量的重要环节。本文将介绍针对Spring Boot应用的单元测试、集成测试和端到端测试的策略,以及如何使用Mock对象和测试切片来模拟外部依赖。同时,我们将使用JUnit和Spring Test框架进…

简述分代垃圾回收器是怎么工作的?

分代垃圾回收器是一种用于管理和回收内存中垃圾对象的技术。它根据对象的存活时间将内存分为不同的代,并针对每个代应用不同的垃圾回收策略。 分代垃圾回收器的工作过程如下: 内存分代:首先,将内存分为不同的代,通常是…

解决 SpringBoot 的 Date、LocalDateTime 变成时间戳和数组的问题,创建自定义对象消息转换器

问题描述 SpringBoot 项目,当返回前端的数据类型为 Map 的时候,在 Map 中 put() 时间对象会出现以下问题: 传递的 Date 对象会变成时间戳传递的 LocalDateTime 对象会变成数组 问题复现 编写一个 Controller 方法,返回值为 Ma…

Java并发: 基于Unsafe的CAS实现无锁数据结构

在上一篇Java并发: 面临的挑战文章中说过CAS是解决原子性问题的方案之一。Unsafe提供了CAS的支持,支持实例化对象、访问私有属性、堆外内存访问、线程的启停等功能。 许多Java的并发类库都是基于Unsafe实现的,比如原子类AtomicInteger,并发数…

多线程(C++11)

多线程(C) 文章目录 多线程(C)前言一、std::thread类1.线程的创建1.1构造函数1.2代码演示 2.公共成员函数2.1 get_id()2.2 join()2.3 detach()2.4 joinable()2.5 operator 3.静态函数4.类的成员函数作为子线程的任务函数 二、call…

【Linux学习】深入探索进程等待与进程退出码和退出信号

文章目录 退出码return退出 进程的等待进程等待的方法 退出码 main函数的返回值:进程的退出码。 一般为0表示成功,非0表示失败。 每一个非0退出码都表示一个失败的原因; echo $?命令 作用:查看进程退出码。&#xf…

I.MX6ULL Linux C语言开发环境搭建(点灯实验)

系列文章目录 I.MX6ULL Linux C语言开发 I.MX6ULL Linux C语言开发 系列文章目录一、前言二、硬件原理分析三、构建步骤一、 C语言运行环境构建二、软件编写三、链接脚本 四、实验程序编写五、编译下载验证 一、前言 汇编语言编写 LED 灯实验,但是实际开发过程中汇…

Go语言的内存泄漏如何检测和避免?

文章目录 Go语言内存泄漏的检测与避免一、内存泄漏的检测1. 使用性能分析工具2. 使用内存泄漏检测工具3. 代码审查与测试 二、内存泄漏的避免1. 使用defer关键字2. 使用垃圾回收机制3. 避免循环引用4. 使用缓冲池 Go语言内存泄漏的检测与避免 在Go语言开发中,内存泄…

【已解决】C#设置Halcon显示区域Region的颜色

前言 在开发过程中,突然发现我需要显示的筛选区域的颜色是白色的,如下图示,这对我们来说不明显会导致我的二值化筛选的时候存在误差,因此我们需要更换成红色显示这样的话就可以更加的明显,二值化筛选更加的准确。 解…

java: 无法访问org.springframework.ldap.core.LdapTemplate

完整错误: java: 无法访问org.springframework.ldap.core.LdapTemplate错误的类文件: /E:/apache-maven-3.6.3/repository/org/springframework/ldap/spring-ldap-core/3.2.3/spring-ldap-core-3.2.3.jar!/org/springframework/ldap/core/LdapTemplate.class类文件具…

《2024年中国机器人行业投融资报告》| 附下载

近年来,国内机器人行业取得了显著的技术进步,包括人工智能、感知技术、自主导航等技术方面的突破,使得机器人能够更好地适应复杂环境和任务需求,带动了机器人行业加快发展。 当然,技术的进步是外在驱动因素&#xff0…

深入探索微软Edge:新一代浏览器的演进与创新

在数字时代的浪潮中,浏览器已不再只是简单的网页访问工具,而是成为了连接信息、服务与用户之间的重要桥梁。微软Edge作为微软公司推出的一款全新的浏览器,不仅承载着微软在互联网领域的最新愿景,还融合了多项前沿技术,…

探索集合python(Set)的神秘面纱:它与字典有何不同?

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、集合(Set)与字典(Dictionary)的初识 1. …

L2-038 病毒溯源

详解代码 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 10010,M10010;int n; int h[N], e[M], ne[M], idx;//邻接表,h表示顶点&#xff0c;e表示当前边的终点&#xff0c;ne表示下一条边&#xff0c;idx当…

海外动态IP代理如何提高效率?

动态住宅IP代理之所以能够有效提升数据爬取的效率和准确性&#xff0c;主要归功于其提供的IP地址具有高度的匿名性和真实性。这些IP地址来自于真实的用户网络&#xff0c;因此相比于数据中心IP&#xff0c;它们更不容易被网站的安全系统标识为爬虫。此外&#xff0c;由于IP地址…

XSS 攻击

XSS(Cross site Scripting,跨站脚本攻击)&#xff0c;是指攻击者利用站点的漏洞&#xff0c;在表单提交时&#xff0c;在表单内容中加入一些恶意脚本&#xff0c;当其他正常用户浏览页面&#xff0c;而页面中刚好出现攻击者的恶意脚本时&#xff0c;脚本被执行&#xff0c;从而…

【vue-1】vue入门—创建一个vue应用

最近在闲暇时间想学习一下前端框架vue&#xff0c;主要参考以下两个学习资料。 官网 快速上手 | Vue.js b站学习视频 2.创建一个Vue3应用_哔哩哔哩_bilibili 一、创建一个vue3应用 <!DOCTYPE html> <html lang"en"> <head><meta charset&q…

NodeJS安装并生成Vue脚手架(保姆级)

文章目录 NodeJS下载配置环境变量Vue脚手架生成Vue脚手架创建项目Vue项目绑定git 更多相关内容可查看 NodeJS下载 下载地址&#xff1a;https://nodejs.org/en 下载的速度应该很快&#xff0c;下载完可以无脑安装&#xff0c;以下记得勾选即可 注意要记住自己的安装路径&…

【Linux】简单模拟C语言文件标准库FILE

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

Kaggle——First Machine Learning Model

kaggle&#xff08;需要魔法才能访问&#xff09;:https://www.kaggle.com/ 需要下载的数据集&#xff1a;melb_data.csv、train.csv&#xff08;已放在资源里面&#xff09; First Machine Learning Model Selecting Data for Modeling #Selecting Data for Modeling import…