{"id":83191,"date":"2026-09-23T11:23:44","date_gmt":"2026-09-23T05:53:44","guid":{"rendered":"https:\/\/2thenew.online\/blog\/?p=83191"},"modified":"2026-09-29T14:50:58","modified_gmt":"2026-09-29T09:20:58","slug":"postgresql-user-management-its-not-that-difficult","status":"publish","type":"post","link":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/","title":{"rendered":"PostgreSQL User Management: It\u2019s Not That Difficult"},"content":{"rendered":"<div class=\"page-wrap\">\n<section style=\"padding: 48px 0 32px;\">\n<h1>PostgreSQL User Management: A DBA Tool Built for Everyone<\/h1>\n<p style=\"font-size: 1.12rem; color: var(--gray-600); max-width: 680px; margin-top: 8px; line-height: 1.7;\">Managing PostgreSQL roles and privileges is powerful but notoriously opaque.<br \/>\nThis tool wraps every <code>psql<\/code> command you would ever need into a guided,<br \/>\neight-page Streamlit application so your entire team can operate safely,<br \/>\nwithout memorising SQL syntax.<\/p>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 The Problem \u2500\u2500 --><\/p>\n<section>\n<h2>The Problem With psql for Non-DBAs<\/h2>\n<p>PostgreSQL has a layered privilege model: you need <code>CONNECT<\/code> on the database,<br \/>\n<code>USAGE<\/code> on the schema, and <code>SELECT<\/code> on individual tables.<br \/>\nMiss any layer and nothing works \u2014 but the error message rarely tells you which layer<br \/>\nis missing. Senior DBAs know this by muscle memory. Everyone else opens Stack Overflow.<\/p>\n<div class=\"callout callout-warning\"><strong>The most common mistake:<\/strong> granting <code>SELECT<\/code> on a table but forgetting<br \/>\n<code>USAGE<\/code> on the schema. The query fails with <em>&#8220;permission denied for schema&#8221;<\/em> and<br \/>\nnew users spend an hour wondering why. This tool makes that impossible to miss.<\/div>\n<p>This tool solves that by making the hierarchy visible and guiding every action with<br \/>\nplain-English explanations, real-world analogies, and built-in safety checks.<\/p>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 Privilege Hierarchy \u2500\u2500 --><\/p>\n<section>\n<h2>The Privilege Hierarchy \u2014 Visualised<\/h2>\n<p style=\"color: var(--gray-600); margin-bottom: 16px;\">Think of your PostgreSQL cluster as a building. Every door has a lock.<\/p>\n<div class=\"tbl-wrap\">\n<table>\n<thead>\n<tr>\n<th>Level<\/th>\n<th>Analogy<\/th>\n<th>Privileges<\/th>\n<th>When Granted<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Database<\/strong><\/td>\n<td>Building entrance key<\/td>\n<td><code>CONNECT<\/code>, <code>CREATE<\/code>, <code>TEMP<\/code><\/td>\n<td>Granted to almost every role<\/td>\n<\/tr>\n<tr>\n<td><strong>Schema<\/strong><\/td>\n<td>Floor access card<\/td>\n<td><code>USAGE<\/code>, <code>CREATE<\/code><\/td>\n<td>Granted per team or domain<\/td>\n<\/tr>\n<tr>\n<td><strong>Table<\/strong><\/td>\n<td>Room-level permissions<\/td>\n<td><code>SELECT<\/code>, <code>INSERT<\/code>, <code>UPDATE<\/code>, <code>DELETE<\/code>, <code>TRUNCATE<\/code>, <code>REFERENCES<\/code>, <code>TRIGGER<\/code><\/td>\n<td>Fine-grained per role<\/td>\n<\/tr>\n<tr>\n<td><strong>Sequence<\/strong><\/td>\n<td>Key to the number dispenser<\/td>\n<td><code>USAGE<\/code>, <code>SELECT<\/code>, <code>UPDATE<\/code><\/td>\n<td>Needed for auto-increment columns<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p style=\"font-size: .87rem; color: var(--gray-400); margin-top: 10px;\">The app enforces this order \u2014 it will not let you grant table-level privileges<br \/>\nuntil the database and schema levels are confirmed.<\/p>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 Eight Pages \u2500\u2500 --><\/p>\n<section>\n<h2>Eight Pages. One Workflow.<\/h2>\n<div class=\"grid-2\" style=\"margin-top: 4px;\">\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>1. View Users<\/h3>\n<p><span class=\"pill pill-blue\">read<\/span><\/p>\n<\/div>\n<div class=\"card-body\">Browse all database roles with login attributes, connection limits, validity,<br \/>\nand live privilege summary in one searchable table.<\/p>\n<p style=\"margin-top: 8px; font-size: .84rem; color: var(--gray-400);\">Best for: Anyone auditing access<\/p>\n<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>2. Create User<\/h3>\n<p><span class=\"pill pill-green\">write<\/span><\/p>\n<\/div>\n<div class=\"card-body\">Wizard-style form with inline attribute guides. Covers password, connection<br \/>\nlimit, validity date, and role membership with plain-English explanations for each field.<\/p>\n<p style=\"margin-top: 8px; font-size: .84rem; color: var(--gray-400);\">Best for: DBAs, DevOps<\/p>\n<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>3. Manage Privileges<\/h3>\n<p><span class=\"pill pill-green\">write<\/span><\/p>\n<\/div>\n<div class=\"card-body\">Four tabs: Database, Schema, Table, and Roles Attached. Grant or revoke<br \/>\nat every level with a visual privilege hierarchy and common-mistake callouts.<\/p>\n<p style=\"margin-top: 8px; font-size: .84rem; color: var(--gray-400);\">Best for: DBAs, team leads<\/p>\n<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>4. Default Privileges<\/h3>\n<p><span class=\"pill pill-amber\">advanced<\/span><\/p>\n<\/div>\n<div class=\"card-body\">Set <code>ALTER DEFAULT PRIVILEGES<\/code> so future objects inherit the right<br \/>\npermissions automatically. Includes a step-by-step when-to-use guide.<\/p>\n<p style=\"margin-top: 8px; font-size: .84rem; color: var(--gray-400);\">Best for: DBAs setting up new schemas<\/p>\n<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>5. Privilege Reference<\/h3>\n<p><span class=\"pill pill-blue\">read<\/span><\/p>\n<\/div>\n<div class=\"card-body\">In-app cheat-sheet mapping each PostgreSQL privilege to real-world analogies.<br \/>\nNo docs tab-switching needed.<\/p>\n<p style=\"margin-top: 8px; font-size: .84rem; color: var(--gray-400);\">Best for: Everyone<\/p>\n<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>6. Role Templates<\/h3>\n<p><span class=\"pill pill-green\">write<\/span><\/p>\n<\/div>\n<div class=\"card-body\">One-click role provisioning: Read-Only Analyst, Developer, Data Engineer,<br \/>\nAdmin Assistant, App Service Account. Every template ships with a best-for guide.<\/p>\n<p style=\"margin-top: 8px; font-size: .84rem; color: var(--gray-400);\">Best for: DBAs onboarding new team members<\/p>\n<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>7. Alter \/ Drop User<\/h3>\n<p><span class=\"pill pill-green\">write<\/span><\/p>\n<\/div>\n<div class=\"card-body\">Safe attribute editing and role dropping with dependency checks, safety<br \/>\nwarnings, and plain-English explanations of each attribute.<\/p>\n<p style=\"margin-top: 8px; font-size: .84rem; color: var(--gray-400);\">Best for: DBAs<\/p>\n<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>8. Migrate Users<\/h3>\n<p><span class=\"pill pill-amber\">advanced<\/span><\/p>\n<\/div>\n<div class=\"card-body\">Cross-server role migration with a clear what-migrates \/ what-does-not panel.<br \/>\nCovers role attributes, memberships, and privileges.<\/p>\n<p style=\"margin-top: 8px; font-size: .84rem; color: var(--gray-400);\">Best for: DBAs during migrations<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 Role Templates \u2500\u2500 --><\/p>\n<section>\n<h2>Role Templates \u2014 Onboard in Seconds<\/h2>\n<p>The most time-consuming part of user management is deciding which privileges a new colleague needs.<br \/>\nFive pre-built profiles answer that with a best-for guide and a checklist of exactly what gets created.<\/p>\n<div class=\"tbl-wrap\" style=\"margin-top: 16px;\">\n<table>\n<thead>\n<tr>\n<th>Template<\/th>\n<th>What It Grants<\/th>\n<th>Best For<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Read-Only Analyst<\/strong><\/td>\n<td><code>CONNECT<\/code> + <code>USAGE<\/code> + <code>SELECT<\/code> on all tables<\/td>\n<td>BI tools, reporting queries<\/td>\n<\/tr>\n<tr>\n<td><strong>Developer<\/strong><\/td>\n<td><code>SELECT<\/code>, <code>INSERT<\/code>, <code>UPDATE<\/code>, <code>DELETE<\/code> on app schemas<\/td>\n<td>Backend services in non-prod<\/td>\n<\/tr>\n<tr>\n<td><strong>Data Engineer<\/strong><\/td>\n<td><code>CREATE<\/code> schema, full table CRUD, <code>TRUNCATE<\/code><\/td>\n<td>ETL pipelines, data loaders<\/td>\n<\/tr>\n<tr>\n<td><strong>Admin Assistant<\/strong><\/td>\n<td>Read on most tables, limited write on reference data<\/td>\n<td>Ops teams that need light write access<\/td>\n<\/tr>\n<tr>\n<td><strong>App Service Account<\/strong><\/td>\n<td>Minimal CRUD scoped to the application schema only<\/td>\n<td>Production application connections<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 DBA Guidance Layer \u2500\u2500 --><\/p>\n<section>\n<h2>The DBA Guidance Layer<\/h2>\n<p>Every page ships a right-side panel powered by <code>dba_help.py<\/code> \u2014 a centralised library<br \/>\nof analogies, warnings, and step-by-step guides. The content is context-sensitive: open<br \/>\nManage Privileges and you see the privilege hierarchy; open Migrate Users and you see<br \/>\nwhat migrates versus what you must re-create manually.<\/p>\n<div class=\"callout callout-info\">The guidance panel is <strong>read-only<\/strong>. It never changes your database \u2014<br \/>\nit explains what the active form will do before you click.<\/div>\n<div class=\"grid-2\" style=\"margin-top: 16px;\">\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>Analogies<\/h3>\n<\/div>\n<div class=\"card-body\">Every privilege explained as a real-world lock-and-key metaphor, not just SQL syntax.<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>Common Mistakes<\/h3>\n<\/div>\n<div class=\"card-body\">Callouts for the top five errors: the schema USAGE trap, sequence permissions, public schema risks.<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>Step Guides<\/h3>\n<\/div>\n<div class=\"card-body\">Numbered walkthroughs for Default Privileges, cross-server migration, and role templates.<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>Attribute Glossary<\/h3>\n<\/div>\n<div class=\"card-body\">Plain-English definitions of <code>SUPERUSER<\/code>, <code>CREATEROLE<\/code>, <code>INHERIT<\/code>, <code>BYPASSRLS<\/code>, and every role attribute.<\/div>\n<\/div>\n<\/div>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 Migrate Users \u2500\u2500 --><\/p>\n<section>\n<h2>Migrate Users Across Servers<\/h2>\n<p>The Migrate Users page handles the scenario every DBA dreads: moving role definitions<br \/>\nfrom an old cluster to a new one. Supply source and target connection details, pick the<br \/>\nroles to migrate, and the tool scripts the transfer \u2014 with a clear side-by-side summary<br \/>\nof what will and will not be carried over.<\/p>\n<div class=\"grid-2\" style=\"margin-top: 16px;\">\n<div class=\"card\">\n<div class=\"card-header\">\n<h3 style=\"color: var(--green);\">\u2713 What Migrates<\/h3>\n<\/div>\n<div class=\"card-body\">\n<ul style=\"display: flex; flex-direction: column; gap: 6px;\">\n<li class=\"migrate-good\">+ Role name and attributes<\/li>\n<li class=\"migrate-good\">+ Password hash (MD5 or SCRAM)<\/li>\n<li class=\"migrate-good\">+ Role memberships<\/li>\n<li class=\"migrate-good\">+ Connection limit<\/li>\n<li class=\"migrate-good\">+ Validity dates<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3 style=\"color: var(--gray-600);\">\u21bb Must Re-Create Manually<\/h3>\n<\/div>\n<div class=\"card-body\">\n<ul style=\"display: flex; flex-direction: column; gap: 6px;\">\n<li class=\"migrate-muted\">\u2015 Object privileges (GRANT statements)<\/li>\n<li class=\"migrate-muted\">\u2015 Default privileges<\/li>\n<li class=\"migrate-muted\">\u2015 Schema ownership<\/li>\n<li class=\"migrate-muted\">\u2015 Row-level security policies<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 Safety &amp; Security \u2500\u2500 --><\/p>\n<section>\n<h2>Safety and Security Model<\/h2>\n<div class=\"grid-2\">\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>\ud83d\udd12 No Stored Passwords<\/h3>\n<\/div>\n<div class=\"card-body\">Credentials are entered at session time and held only in Streamlit session state. Nothing is written to disk or logged.<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>\ud83d\udcbe Saved Connections<\/h3>\n<\/div>\n<div class=\"card-body\">Host, port, database, and username are saved locally. Passwords are never included in the saved file.<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>\ud83d\udd04 Transaction Safety<\/h3>\n<\/div>\n<div class=\"card-body\">Every write uses <code>ensure_clean_conn()<\/code> to roll back any aborted transaction before retrying, preventing silent partial-state bugs.<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-header\">\n<h3>\u2705 Dependency Checks<\/h3>\n<\/div>\n<div class=\"card-body\">Alter \/ Drop checks for active sessions and owned objects before allowing a destructive action.<\/div>\n<\/div>\n<\/div>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 Getting Started \u2500\u2500 --><\/p>\n<section>\n<h2>Getting Started<\/h2>\n<div class=\"steps\" style=\"margin-top: 8px;\">\n<div class=\"step\">\n<div class=\"step-num\">1. Clone or download<\/div>\n<div>\n<div class=\"step-desc\"><a href=\"https:\/\/github.com\/AkshayPC2611\/PostgreSQL-Users-Manager\/\">PostgreSQL-Users-Manager\/<\/a><\/div>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-num\">2. Install dependencies<\/div>\n<div>\n<div class=\"step-desc\"><code>pip install -r requirements.txt<\/code><\/div>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-num\">3. Run the app<\/div>\n<div>\n<div class=\"step-desc\">\n<p><code>streamlit run app.py<\/code><\/p>\n<p>4. Connect<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-num\"><\/div>\n<div>\n<div class=\"step-desc\">\n<p>Enter host, port, database, username, and password on the connection screen.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"step\">\n<div class=\"step-num\">\n<p>5. Save the connection<\/p>\n<\/div>\n<div>\n<div class=\"step-desc\">Click <strong>Save Connection<\/strong> to avoid re-typing next session (password excluded).<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 Project Structure \u2500\u2500 --><\/p>\n<section>\n<h2>Project Structure<\/h2>\n<div class=\"tbl-wrap\" style=\"margin-top: 4px;\">\n<table>\n<thead>\n<tr>\n<th>File \/ Folder<\/th>\n<th>Purpose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>app.py<\/code><\/td>\n<td>Entry point, navigation, saved-connection manager<\/td>\n<\/tr>\n<tr>\n<td><code>db_utils.py<\/code><\/td>\n<td>psycopg2 helpers, <code>ensure_clean_conn()<\/code>, all DB queries<\/td>\n<\/tr>\n<tr>\n<td><code>dba_help.py<\/code><\/td>\n<td>All right-panel content: analogies, warnings, guides<\/td>\n<\/tr>\n<tr>\n<td><code>pages\/1_View_Users.py<\/code><\/td>\n<td>User table browser with attribute tooltips<\/td>\n<\/tr>\n<tr>\n<td><code>pages\/2_Create_User.py<\/code><\/td>\n<td>Wizard form with inline attribute guide<\/td>\n<\/tr>\n<tr>\n<td><code>pages\/3_Manage_Privileges.py<\/code><\/td>\n<td>4-tab privilege management UI<\/td>\n<\/tr>\n<tr>\n<td><code>pages\/4_Default_Privileges.py<\/code><\/td>\n<td>ALTER DEFAULT PRIVILEGES interface<\/td>\n<\/tr>\n<tr>\n<td><code>pages\/5_Privilege_Reference.py<\/code><\/td>\n<td>In-app privilege cheat-sheet<\/td>\n<\/tr>\n<tr>\n<td><code>pages\/6_Role_Templates.py<\/code><\/td>\n<td>One-click role provisioning<\/td>\n<\/tr>\n<tr>\n<td><code>pages\/7_Alter_Drop_User.py<\/code><\/td>\n<td>Safe user modification and drop<\/td>\n<\/tr>\n<tr>\n<td><code>pages\/8_Migrate_Users.py<\/code><\/td>\n<td>Cross-server role migration<\/td>\n<\/tr>\n<tr>\n<td><code>requirements.txt<\/code><\/td>\n<td>streamlit, psycopg2-binary, pandas<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 What's Next \u2500\u2500 --><\/p>\n<section>\n<h2>What Could Come Next<\/h2>\n<p style=\"color: var(--gray-600); margin-bottom: 16px;\">The core feature set is stable. Here are natural extensions for the future:<\/p>\n<div class=\"grid-2\">\n<div class=\"card\">\n<div class=\"card-body\">+ Audit log \u2014 write every GRANT\/REVOKE action to a history table<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-body\">+ LDAP \/ SSO integration for authentication<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-body\">+ Row-level security (RLS) policy management UI<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-body\">+ Scheduled privilege reviews with email digest<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-body\">+ Multi-cluster dashboard across environments<\/div>\n<\/div>\n<div class=\"card\">\n<div class=\"card-body\">+ Export privilege snapshot as Excel \/ CSV<\/div>\n<\/div>\n<\/div>\n<\/section>\n<hr class=\"divider\" \/>\n<p><!-- \u2500\u2500 Closing \u2500\u2500 --><\/p>\n<div class=\"card\">\n<div class=\"card-body closing\">\n<h2>Built by a DBA, For Everyone Else<\/h2>\n<p>PostgreSQL is one of the most powerful databases in the world \u2014 but its privilege<br \/>\nmodel is also one of the hardest to operate safely without deep SQL knowledge.<br \/>\nThis tool bridges that gap: it gives DBAs a faster workflow, and gives everyone<br \/>\nelse a safe, guided path to the same outcomes.<\/p>\n<div class=\"pill-row\" style=\"justify-content: center;\"><span class=\"pill pill-green\">Open Source<\/span><br \/>\n<span class=\"pill pill-blue\">Python 3.8+<\/span><br \/>\n<span class=\"pill pill-gray\">PostgreSQL 12+<\/span><br \/>\n<span class=\"pill pill-gray\">Streamlit 1.x<\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><!-- \/page-wrap --><\/p>\n<footer>PostgreSQL User Management Tool \u2014 Technical Blog \u00a0|\u00a0 September 2026 \u00a0|\u00a0 Akshay Prakash Chikane<\/footer>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PostgreSQL User Management: A DBA Tool Built for Everyone Managing PostgreSQL roles and privileges is powerful but notoriously opaque. This tool wraps every psql command you would ever need into a guided, eight-page Streamlit application so your entire team can operate safely, without memorising SQL syntax. The Problem With psql for Non-DBAs PostgreSQL has a [&hellip;]<\/p>\n","protected":false},"author":1920,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":7,"footnotes":""},"categories":[5872],"tags":[1474,9008,1358,9009],"class_list":["post-83191","post","type-post","status-publish","format-standard","hentry","category-database-administration","tag-opensource","tag-postgresqlmanager","tag-python","tag-stremlit"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"PostgreSQL User Management: A DBA Tool Built for Everyone Managing PostgreSQL roles and privileges is powerful but notoriously opaque. This tool wraps every psql command you would ever need into a guided, eight-page Streamlit application so your entire team can operate safely, without memorising SQL syntax. The Problem With psql for Non-DBAs PostgreSQL has a\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Akshay Prakash Chikane\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"TO THE NEW BLOG\" \/>\n\t\t<meta property=\"og:type\" content=\"blog\" \/>\n\t\t<meta property=\"og:title\" content=\"PostgreSQL User Management: It\u2019s Not That Difficult | TO THE NEW Blog\" \/>\n\t\t<meta property=\"og:description\" content=\"PostgreSQL User Management: A DBA Tool Built for Everyone Managing PostgreSQL roles and privileges is powerful but notoriously opaque. This tool wraps every psql command you would ever need into a guided, eight-page Streamlit application so your entire team can operate safely, without memorising SQL syntax. The Problem With psql for Non-DBAs PostgreSQL has a\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/2thenew.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/2thenew.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@tothenew\" \/>\n\t\t<meta name=\"twitter:title\" content=\"PostgreSQL User Management: It\u2019s Not That Difficult | TO THE NEW Blog\" \/>\n\t\t<meta name=\"twitter:description\" content=\"PostgreSQL User Management: A DBA Tool Built for Everyone Managing PostgreSQL roles and privileges is powerful but notoriously opaque. This tool wraps every psql command you would ever need into a guided, eight-page Streamlit application so your entire team can operate safely, without memorising SQL syntax. The Problem With psql for Non-DBAs PostgreSQL has a\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/2thenew.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/#article\",\"name\":\"PostgreSQL User Management: It\\u2019s Not That Difficult | TO THE NEW Blog\",\"headline\":\"PostgreSQL User Management: It\\u2019s Not That Difficult\",\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/akshay-chikane\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"},\"datePublished\":\"2026-09-23T11:23:44+05:30\",\"dateModified\":\"2026-09-29T14:50:58+05:30\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/#webpage\"},\"articleSection\":\"Database Administration, opensource, PostgreSQLManager, python, Stremlit\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/database-administration\\\/#listItem\",\"name\":\"Database Administration\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/database-administration\\\/#listItem\",\"position\":2,\"name\":\"Database Administration\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/database-administration\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/#listItem\",\"name\":\"PostgreSQL User Management: It\\u2019s Not That Difficult\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/#listItem\",\"position\":3,\"name\":\"PostgreSQL User Management: It\\u2019s Not That Difficult\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/database-administration\\\/#listItem\",\"name\":\"Database Administration\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\",\"name\":\"TO THE NEW Blog\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/akshay-chikane\\\/#author\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/akshay-chikane\\\/\",\"name\":\"Akshay Prakash Chikane\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/#authorImage\",\"url\":\"https:\\\/\\\/newersworld-sf-static.tothenew.net\\\/prod\\\/profilePicFolder\\\/3610eead-8487-457d-b78a-b039cc313165_5081-Akshay-Prakash-Chikane-PROFILEPICTURE.jpeg\",\"width\":96,\"height\":96,\"caption\":\"Akshay Prakash Chikane\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/#webpage\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/\",\"name\":\"PostgreSQL User Management: It\\u2019s Not That Difficult | TO THE NEW Blog\",\"description\":\"PostgreSQL User Management: A DBA Tool Built for Everyone Managing PostgreSQL roles and privileges is powerful but notoriously opaque. This tool wraps every psql command you would ever need into a guided, eight-page Streamlit application so your entire team can operate safely, without memorising SQL syntax. The Problem With psql for Non-DBAs PostgreSQL has a\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/postgresql-user-management-its-not-that-difficult\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/akshay-chikane\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/akshay-chikane\\\/#author\"},\"datePublished\":\"2026-09-23T11:23:44+05:30\",\"dateModified\":\"2026-09-29T14:50:58+05:30\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\",\"name\":\"TO THE NEW Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"PostgreSQL User Management: It\u2019s Not That Difficult | TO THE NEW Blog","description":"PostgreSQL User Management: A DBA Tool Built for Everyone Managing PostgreSQL roles and privileges is powerful but notoriously opaque. This tool wraps every psql command you would ever need into a guided, eight-page Streamlit application so your entire team can operate safely, without memorising SQL syntax. The Problem With psql for Non-DBAs PostgreSQL has a","canonical_url":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/#article","name":"PostgreSQL User Management: It\u2019s Not That Difficult | TO THE NEW Blog","headline":"PostgreSQL User Management: It\u2019s Not That Difficult","author":{"@id":"https:\/\/2thenew.online\/blog\/author\/akshay-chikane\/#author"},"publisher":{"@id":"https:\/\/2thenew.online\/blog\/#organization"},"datePublished":"2026-09-23T11:23:44+05:30","dateModified":"2026-09-29T14:50:58+05:30","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/#webpage"},"isPartOf":{"@id":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/#webpage"},"articleSection":"Database Administration, opensource, PostgreSQLManager, python, Stremlit"},{"@type":"BreadcrumbList","@id":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/2thenew.online\/blog#listItem","position":1,"name":"Home","item":"https:\/\/2thenew.online\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/2thenew.online\/blog\/category\/database-administration\/#listItem","name":"Database Administration"}},{"@type":"ListItem","@id":"https:\/\/2thenew.online\/blog\/category\/database-administration\/#listItem","position":2,"name":"Database Administration","item":"https:\/\/2thenew.online\/blog\/category\/database-administration\/","nextItem":{"@type":"ListItem","@id":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/#listItem","name":"PostgreSQL User Management: It\u2019s Not That Difficult"},"previousItem":{"@type":"ListItem","@id":"https:\/\/2thenew.online\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/#listItem","position":3,"name":"PostgreSQL User Management: It\u2019s Not That Difficult","previousItem":{"@type":"ListItem","@id":"https:\/\/2thenew.online\/blog\/category\/database-administration\/#listItem","name":"Database Administration"}}]},{"@type":"Organization","@id":"https:\/\/2thenew.online\/blog\/#organization","name":"TO THE NEW Blog","url":"https:\/\/2thenew.online\/blog\/"},{"@type":"Person","@id":"https:\/\/2thenew.online\/blog\/author\/akshay-chikane\/#author","url":"https:\/\/2thenew.online\/blog\/author\/akshay-chikane\/","name":"Akshay Prakash Chikane","image":{"@type":"ImageObject","@id":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/#authorImage","url":"https:\/\/newersworld-sf-static.tothenew.net\/prod\/profilePicFolder\/3610eead-8487-457d-b78a-b039cc313165_5081-Akshay-Prakash-Chikane-PROFILEPICTURE.jpeg","width":96,"height":96,"caption":"Akshay Prakash Chikane"}},{"@type":"WebPage","@id":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/#webpage","url":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/","name":"PostgreSQL User Management: It\u2019s Not That Difficult | TO THE NEW Blog","description":"PostgreSQL User Management: A DBA Tool Built for Everyone Managing PostgreSQL roles and privileges is powerful but notoriously opaque. This tool wraps every psql command you would ever need into a guided, eight-page Streamlit application so your entire team can operate safely, without memorising SQL syntax. The Problem With psql for Non-DBAs PostgreSQL has a","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/2thenew.online\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/#breadcrumblist"},"author":{"@id":"https:\/\/2thenew.online\/blog\/author\/akshay-chikane\/#author"},"creator":{"@id":"https:\/\/2thenew.online\/blog\/author\/akshay-chikane\/#author"},"datePublished":"2026-09-23T11:23:44+05:30","dateModified":"2026-09-29T14:50:58+05:30"},{"@type":"WebSite","@id":"https:\/\/2thenew.online\/blog\/#website","url":"https:\/\/2thenew.online\/blog\/","name":"TO THE NEW Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/2thenew.online\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"TO THE NEW BLOG","og:type":"blog","og:title":"PostgreSQL User Management: It\u2019s Not That Difficult | TO THE NEW Blog","og:description":"PostgreSQL User Management: A DBA Tool Built for Everyone Managing PostgreSQL roles and privileges is powerful but notoriously opaque. This tool wraps every psql command you would ever need into a guided, eight-page Streamlit application so your entire team can operate safely, without memorising SQL syntax. The Problem With psql for Non-DBAs PostgreSQL has a","og:url":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/","og:image":"https:\/\/2thenew.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","og:image:secure_url":"https:\/\/2thenew.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","twitter:card":"summary","twitter:site":"@tothenew","twitter:title":"PostgreSQL User Management: It\u2019s Not That Difficult | TO THE NEW Blog","twitter:description":"PostgreSQL User Management: A DBA Tool Built for Everyone Managing PostgreSQL roles and privileges is powerful but notoriously opaque. This tool wraps every psql command you would ever need into a guided, eight-page Streamlit application so your entire team can operate safely, without memorising SQL syntax. The Problem With psql for Non-DBAs PostgreSQL has a","twitter:image":"https:\/\/2thenew.online\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png"},"aioseo_meta_data":{"post_id":"83191","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"created":"2026-09-11 08:29:05","updated":"2026-09-29 09:21:00","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/2thenew.online\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/2thenew.online\/blog\/category\/database-administration\/\" title=\"Database Administration\">Database Administration<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tPostgreSQL User Management: It\u2019s Not That Difficult\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/2thenew.online\/blog"},{"label":"Database Administration","link":"https:\/\/2thenew.online\/blog\/category\/database-administration\/"},{"label":"PostgreSQL User Management: It\u2019s Not That Difficult","link":"https:\/\/2thenew.online\/blog\/postgresql-user-management-its-not-that-difficult\/"}],"_links":{"self":[{"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/posts\/83191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/users\/1920"}],"replies":[{"embeddable":true,"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/comments?post=83191"}],"version-history":[{"count":2,"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/posts\/83191\/revisions"}],"predecessor-version":[{"id":83768,"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/posts\/83191\/revisions\/83768"}],"wp:attachment":[{"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/media?parent=83191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/categories?post=83191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/2thenew.online\/blog\/wp-json\/wp\/v2\/tags?post=83191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}