Skip to main content

DB Link Test on Local Cluster across Two DBs with Non Postgres Owner and Non Public Schema

Test Purpose :

DB Link Test on Local Cluster across Two DBs with Non  Postgres Owner and  Non Public Schema
So that I have revoked public access and included search path replacement of my own schemas.


Scenario :
Same Local Cluster -> Different Database -> Both Users are having Own different Schema and Both DB Owners are different


DB :   dvdrental, adventureworks.

schema : dvd_schema,adv_schema
users : dvd_user, adv_user
tablespaces : dvd_ts, adv_ts


Test : Access dvd_t1 from advuser@adventureworks

Steps :

psql >
postgres=# revoke all on schema public from public;
postgres=#  revoke all on schema public from dvduser;
REVOKE
postgres=#  revoke all on schema public from advuser;
REVOKE
postgres=#


bash-4.2$ psql -d  dvdrental -U dvduser
psql (11.4)
Type "help" for help.

dvdrental=# create table dvd_t1(name varchar(10),id int2);
CREATE TABLE
dvdrental=# \d
           List of relations
   Schema   |  Name  | Type  |  Owner
------------+--------+-------+---------
 dvd_schema | dvd_t1 | table | dvduser
(1 row)

dvdrental=# insert into dvd_t1 values ('film1',10);
INSERT 0 1
dvdrental=# insert into dvd_t1 values ('film2',20);
INSERT 0 1
dvdrental=# insert into dvd_t1 values ('film3',30);
INSERT 0 1
dvdrental=#


Execute the below command whether db_link ext is already installed or not.

SELECT pg_namespace.nspname, pg_proc.proname  FROM pg_proc, pg_namespace
WHERE pg_proc.pronamespace=pg_namespace.oid  AND pg_proc.proname LIKE '%dblink%';

If not then, it will return 0 Rows.

Test the DBlink connection. Since I revoked public access, I have mentioned externally in the statement.

Adventureworks=# select public.dblink_connect('host=pg1 user=dvduser password=dvduser123 dbname=dvdrental');
 dblink_connect
----------------
 OK
(1 row)

Adventureworks=#


check postgress_fdw Ext is already installed or not.


Adventureworks=# \dx
                                    List of installed extensions
     Name     | Version |   Schema   |                         Description
--------------+---------+------------+--------------------------------------------------------------
 dblink       | 1.2     | public     | connect to other PostgreSQL databases from within a database
 plpgsql      | 1.0     | pg_catalog | PL/pgSQL procedural language
 postgres_fdw | 1.0     | public     | foreign-data wrapper for remote PostgreSQL servers
(3 rows)


Adventureworks=# CREATE FOREIGN DATA WRAPPER adv_to_dvd_fdw VALIDATOR postgresql_fdw_validator;
CREATE FOREIGN DATA WRAPPER

Adventureworks=# create server adv_to_dvd_server FOREIGN DATA WRAPPER adv_to_dvd_fdw OPTIONS (hostaddr '192.168.56.101',dbname 'dvdrental');
CREATE SERVER

Adventureworks=# CREATE USER MAPPING FOR advuser SERVER adv_to_dvd_server OPTIONS (user 'dvduser',password 'dvduser123');
CREATE USER MAPPING

Adventureworks=# SELECT public.dblink_connect('adv_to_dvd_server');

 dblink_connect
----------------
 OK
(1 row)

Adventureworks=# GRANT USAGE ON FOREIGN SERVER adv_to_dvd_server to advuser;
GRANT

Adventureworks=# 

Test 1 with Exact Cols as per original table :
**********************************************
select * from public.dblink('adv_to_dvd_server','select name,id from dvdrental.dvd_schema.dvd_t1') AS DATA(CNAME varchar(10), CID int2);

 cname | cid
-------+-----
 film1 |  10
 film2 |  20
 film3 |  30
(3 rows)


Test 2 with only one col :
**********************************************

select CID from public.dblink('adv_to_dvd_server','select id from dvdrental.dvd_schema.dvd_t1') AS DATA(CID int8);
 cid
-----
  10
  20
  30
(3 rows)


Test 1 with Relevant Data columns change
**********************************************

Adventureworks=# select CID from public.dblink('adv_to_dvd_server','select id from dvdrental.dvd_schema.dvd_t1') AS DATA(CID int8);
 cid
-----
  10
  20
  30
(3 rows)

Adventureworks=# select * from public.dblink('adv_to_dvd_server','select name,id from dvdrental.dvd_schema.dvd_t1') AS DATA(CNAME varchar(20), CID int8);
 cname | cid
-------+-----
 film1 |  10
 film2 |  20
 film3 |  30
(3 rows)

Adventureworks=# select * from public.dblink('adv_to_dvd_server','select name,id from dvdrental.dvd_schema.dvd_t1') AS DATA(CNAME text, CID int8);
 cname | cid
-------+-----
 film1 |  10
 film2 |  20
 film3 |  30
(3 rows)

Adventureworks=#

Comments

Popular posts from this blog

How to configure Barman along with One Node Wal Streaming.

How to configure Barman : Step 1 : Remove existing postgres Instllations if you have for safer side. sudo su root ==> yum remove postgres* & yum remove barman* step 2 : Install this on Both Prod & Backup servers. PostgreSQL 11 You can install the 2ndQuadrant's General Public RPM repository for PostgreSQL 11 by running the following instructions as a user with sudo privileges on the destination Linux server: curl https://dl.2ndquadrant.com/default/release/get/11/rpm | sudo bash The above command will run a shell script that will install the repository definition in your server. You can check the content of the script by running: curl https://dl.2ndquadrant.com/default/release/get/11/rpm | less Step 3 : Install EPEL depends on OS version on prod :  CentOS/RHEL - 7 rpm -Uvh https://yum.postgresql.org/11/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum install postgresql11-server yum install postgresql11-contrib  ===> Th

PG Frequently used DBA Commands

************************************************************************************************************************************************** NOTE :  By default if You connect any DB in the Cluster with out specified User Name, Eventhough those DBs are owned by different users, then internally postgres will be the User and Public is the default Schema Name respective to that. If you create any tables after logging into DB, It will use Public Schema only since this will be the default search path. If you connect db along with particular user then, objects will be created to the respective corresponding schema pointed to the owner. Even you revoke Public Schema access to respective of all users or specified users, By default search path will be public only. But since public is revoked, it will look out who is the owner of the schema to own the object as owner. ALTER ROLE advuser IN DATABASE "Adventureworks"     SET search_path TO adv_s

PG Replication on 10 Master / Slave Configuration using traditional cp

How to do Streaming / Replication Setup on PG : ************************************* Stage 1 : Note down, In this Stage 1, The below example shows that Primary and Standby replication only..No fail over & Fail Back..           For failover , refer stage 2 and fail back refer stage 3 . Primary : Primary Side  : 192.168.100.11 Secondary   : 192.168.100.12 1. CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'replicator'; 2. Edit postgresql.conf as below ALTER SYSTEM SET wal_level TO 'replica';    Must be at least set to hot_standby  until version 9.5 or replica ALTER SYSTEM SET archive_mode TO 'ON'; ALTER SYSTEM SET max_wal_senders TO '3'; ALTER SYSTEM SET wal_keep_segments TO '10'; ALTER SYSTEM SET listen_addresses TO '*'; ALTER SYSTEM SET hot_standby TO 'ON'; ALTER SYSTEM SET archive_command TO 'cp %p /mnt/server/archivedir/%f';  You may not need archive_mode or archive_command or res