Schema management in Postgresql
postgres=# \du         List of roles Role name |  Attributes                    | Member of -------------+-----------------------------------------------------------+----------- learnomate | Superuser                         | {} postgres   | Superuser, Create role, Create DB, Replication, Bypass RLS| {} u2      |                              | {} tom     |                              | {}
postgres=# create user rajesh with password 'test123'; CREATE ROLE postgres=# \du         List of roles Role name |  Attributes                    | Member of -------------+-----------------------------------------------------------+----------- learnomate | Superuser                         | {} postgres   | Superuser, Create role, Create DB, Replication, Bypass RLS| {} u1      |                              | {} u2 | | {} tom     |                              | {} postgres=# Â
postgres=# postgres=# postgres=# alter user learnomate nosuperuser; ALTER ROLE postgres=# \du postgres=# create user rajesh with password 'test123'; CREATE ROLE postgres=# \du         List of roles Role name |  Attributes                     | Member of -------------+-----------------------------------------------------------+----------- learnomate |                          | {} postgres   | Superuser, Create role, Create DB, Replication, Bypass RLS| {} u1      |                              | {} u2 | | {} tom     |                              | {} postgres=# Â
postgres=# \c prod learnomate
connection to server on socket "/run/postgresql/.s.PGSQL.5002" failed: FATAL: no pg_hba.conf entry for host "[local]", user "learnomate", database "prod", no encryption
Previous connection kept
postgres=# \q
-bash-4.2$ pwd
/app01/test_data/pg_tblspc
-bash-4.2$ cd ..
-bash-4.2$ vi pg_hba.conf
-bash-4.2$ pg_ctl -D /app01/test_data/ reload server signaled
-bash-4.2$ psql -p 5002 -U postgres
psql (15.7)
Type "help" for help.
postgres=# \c prod learnomate
Password for user learnomate:
connection to server on socket "/run/postgresql/.s.PGSQL.5002" failed: FATAL: permission denied for database "prod"
DETAIL: User does not have CONNECT privilege. Previous connection kept
Previous connection kept
postgres=# \l+ prod
postgres=# GRANT CONNECT ON DATABASE prod TO learnomate, u1;
GRANT
postgres=# \c prod learnomate
Password for user learnomate:
You are now connected to database "prod" as user "learnomate".
prod=> CREATE SCHEMA learnomate AUTHORIZATION learnomate;
ERROR: permission denied for database prod
prod=> \c prod postgres
You are now connected to database "prod" as user "postgres".
prod=# GRANT CREATE ON DATABASE prod TO learnomate, u1;
GRANT
prod=# \c prod learnomate
Password for user learnomate:
You are now connected to database "prod" as user "learnomate".Â
prod=> CREATE SCHEMA learnomate AUTHORIZATION learnomate;
GRANT
prod=# \c prod learnomate
Password for user learnomate:
You are now connected to database "prod" as user "learnomate".Â
prod=> CREATE SCHEMA learnomate AUTHORIZATION learnomate;
CREATE SCHEMA
prod=> \dn
List of schemas
Name | Owner
-------------+-------------------
learnomate | learnomate
public | pg_database_owner
(2 rows)
prod=> show search_path;
search_path
-----------------
"$user", public
(1 row)
prod=> SET search_path TO learnomate;
SET
prod=> SHOW search_path;
search_path
-------------
learnomate
(1 row)
prod=> CREATE TABLE tb1(id integer, name varchar(20));
CREATE TABLE
prod=> CREATE TABLE tb2(id integer, name varchar(20));
CREATE TABLE
prod=> CREATE TABLE tb3(id integer, name varchar(20));
CREATE TABLE
Listing tables:
prod=> \dt
List of relations
Schema | Name | Type | Owner
------------+------+-------+-----------
learnomate | tb1 | table| learnomate
learnomate | tb2 | table| learnomate
learnomate | tb3 | table| learnomate
(3 rows)
prod=> show search_path;
search_path
-----------------
"$user", public (1 row)
Setting the search_path
to u1
:
prod=> SET search_path TO u1;
SET
Creating Tables in the u1
Schema:
prod=> CREATE TABLE p1(id integer, name varchar(20));
CREATE TABLE
prod=> CREATE TABLE p2(id integer, name varchar(20));
CREATE TABLE
prod=> CREATE TABLE p3(id integer, name varchar(20));
CREATE TABLE
Inserting Data into Tables:
prod=> INSERT INTO p1 VALUES(generate_series(1,10), 'learnomate');
INSERT 0 10
prod=> INSERT INTO p2 VALUES(generate_series(1,10), 'learnomate');
INSERT 0 10
prod=> INSERT INTO p3 VALUES(generate_series(1,10), 'learnomate');
INSERT 0 10
Listing Tables in the u1
Schema:
prod=> \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
u1 | p1 | table | u1
u1 | p2 | table | u1
u1 | p3 | table | u1
(3 rows)
prod=> select current_user; current_user -------------- u1 (1 row)
prod=> set search_path to learnomate; SET prod=> \dt Did not find any relations.
Switching to User learnomate
:
prod=> \c prod learnomate Password for user learnomate: You are now connected to database "prod" as user "learnomate".
Granting Usage on the learnomate
Schema to User u1
:
prod=> GRANT USAGE ON SCHEMA learnomate TO u1; GRANT
Connecting as User u1
:
prod=> \c prod u1 Password for user u1: You are now connected to database "prod" as user "u1".
Setting the search_path
:
prod=> SET search_path TO learnomate;
SET
prod=> \dt List of relations Schema | Name | Type | Owner -----------+------+-------+----------- learnomate | tb1 | table | learnomate learnomate | tb2 | table | learnomate learnomate | tb3 | table | learnomate (3 rows)
prod=> select * from tb1; ERROR: permission denied for table tb1 prod=> create table tb4(id int); ERROR: permission denied for schema learnomate LINE 1: create table tb4(id int);
Granting CREATE
Privilege:
prod=> \c prod learnomate
Password for user learnomate:
You are now connected to database "prod" as user "learnomate".
prod=> GRANT CREATE ON SCHEMA learnomate TO u1;
GRANT
Granting SELECT
Privilege:
prod=> GRANT SELECT ON ALL TABLES IN SCHEMA learnomate TO u1;
GRANT
prod=> \dn+ learnomate List of schemas Name | Owner | Access privileges | Description -----------+------------+--------------------------+------------- learnomate | learnomate | learnomate=UC/learnomate+| | | u1=UC/learnomate | (1 row)
prod=> \z+ learnomate.tab1 invalid command \z+ Try \? for help.
prod=> \z learnomate.tb1 Access privileges Schema | Name | Type | Access privileges | Column | Policies privileges -----------+------+-------+-------------------+------------+---------- learnomate | tb1 | table |learnomate=arwdDxt/| | learnomate+ | | | u1=r/learnomate | | (1 row)
prod=> grant select,insert on all tables in schema learnomate to u1; GRANT prod=> \z learnomate.tb1 Access privileges Schema | Name | Type | Access privileges | Column | Policies privileges -----------+------+-------+--------------------+-----------+---------- learnomate | tb1 | table |learnomate=arwdDxt/ | | learnomate+ | | | u1=ar/learnomate | | (1 row)
Switching to User u1
:
prod=> \c prod u1
Password for user u1:
You are now connected to database "prod" as user "u1".
prod=> set search_path to learnomate
prod-> ;
SET
prod=> select * from tb1;
id | name
---+------------
1 | learnomate
2 | learnomate
3 | learnomate
4 | learnomate
5 | learnomate
6 | learnomate
7 | learnomate
8 | learnomate
9 | learnomate
10| learnomate
(10 rows)
prod=> insert into tb1 values(generate_series(11,15),'learnomate'); INSERT 0 5 prod=> select * from tb1;
id | name
---+------------
1 | learnomate
2 | learnomate
3 | learnomate
4 | learnomate
5 | learnomate
6 | learnomate
7 | learnomate
8 | learnomate
9 | learnomate
10| learnomate
11| learnomate
12| learnomate
13| learnomate
14| learnomate
15| learnomate
(15 rows)
prod=> create table tb4(id integer,name varchar(20)); CREATE TABLE prod=> \dt List of relations Schema | Name| Type | Owner -----------+-----+-------+-------- learnomate | tb1 | table | learnomate learnomate | tb2 | table | learnomate learnomate | tb3 | table | learnomate learnomate | tb4 | table | u1 (4 rows)
prod=> \c prod learnomate
Password for user learnomate:
You are now connected to database "prod" as user "learnomate".
prod=> set search_path to learnomate;
SET
prod=> select * from tb4;
ERROR: permission denied for table tb4
prod=> \dn+ learnomate
List of schemas
Name | Owner | Access privileges | Description
----------+------------+--------------------------+-------------
learnomate| learnomate | learnomate=UC/learnomate+|
| | u1=UC/learnomate |
(1 row)
prod=> \z tb1
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
-----------+------+-------+--------------------+-------------------+----------
learnomate | tb1 | table | learnomate=arwdDxt
/learnomate+| |
| | | u1=ar/learnomate | |
(1 row)
prod=> \c prod u1 Password for user u1:  You are now connected to database "prod" as user "u1". prod=> show search_path; search_path  ----------------- "$user", public (1 row)Â
prod=> \c prod postgres You are now connected to database "prod" as user "postgres". prod=# alter user learnomate set search_path to learnomate; ALTER ROLE prod=# alter user u1 set search_path to u1; ALTER ROLE prod=# select pg_reload_conf(); pg_reload_conf ---------------- t (1 row)
prod=# \c prod learnomate Password for user learnomate:  You are now connected to database "prod" as user "learnomate". prod=> show search_path; search_path  ------------- learnomate (1 row) prod=> \dt List of relations Schema | Name | Type | Owner -----------+------+-------+-------- learnomate | tb1 | table | learnomate learnomate | tb2 | table | learnomate learnomate | tb3 | table | learnomate learnomate | tb4 | table | u1 (4 rows)
prod=> \c prod u1 Password for user u1: You are now connected to database "prod" as user "u1". prod=> \dt List of relations Schema | Name | Type | Owner --------+------+-------+-------- u1 | p1 | table | u1 u1 | p2 | table | u1 u3 | p3 | table | u1 (3 rows)
prod=> \c prod learnomate Password for user learnomate: You are now connected to database "prod" as user "learnomate". prod=> create schema dept; CREATE SCHEMA prod=> \dn Name | Owner --------------+------------------- dept | learnomate learnomate | learnomate public | pg_database_owner u1 | u1 (4 rows)
prod=> set search_path to dept; SET prod=> create table dep1(id integer,name varchar(20)); CREATE TABLE prod=> create table dep2(id integer,name varchar(20)); CREATE TABLE prod=> create table dep3(id integer,name varchar(20)); CREATE TABLE prod=> set search_path to dept,learnomate; SET prod=> \dt       List of relations Schema | Name | Type | Owner -----------+------+-------+------------ dept | dep1 | table | learnomate dept | dep2 | table | learnomate dept | dep3 | table | learnomate learnomate | tb1 | table | learnomate learnomate | tb2 | table | learnomate learnomate | tb3 | table | learnomate learnomate | tb4 | table | u1 (7 rows)
prod=> create table test(id integer,name varchar(20)); CREATE TABLE prod=> \dt List of relations Schema | Name | Type | Owner -----------+------+-------+-------- dept | dep1 | table | learnomate dept | dep2 | table | learnomate dept | dep3 | table | learnomate dept | test | table | learnomate learnomate | tb1 | table | learnomate learnomate | tb2 | table | learnomate learnomate | tb3 | table | learnomate learnomate | tb4 | table | u1 (8 rows)