First version of the function WIP
This commit is contained in:
@@ -150,8 +150,10 @@ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE;
|
|||||||
-- "host": "myhostname.us-east-2.rds.amazonaws.com",
|
-- "host": "myhostname.us-east-2.rds.amazonaws.com",
|
||||||
-- "port": "5432"
|
-- "port": "5432"
|
||||||
-- },
|
-- },
|
||||||
-- "user": "fdw_user",
|
-- "user_mapping": {
|
||||||
-- "password": "secret"
|
-- "user": "fdw_user",
|
||||||
|
-- "password": "secret"
|
||||||
|
-- }
|
||||||
-- ');
|
-- ');
|
||||||
--
|
--
|
||||||
-- Underneath it will:
|
-- Underneath it will:
|
||||||
@@ -169,8 +171,71 @@ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE;
|
|||||||
-- * The publicuser: GRANT amazon TO publicuser;
|
-- * The publicuser: GRANT amazon TO publicuser;
|
||||||
CREATE OR REPLACE FUNCTION @extschema@.CDB_SetUp_Foreign_Server(fdw_name NAME, config json)
|
CREATE OR REPLACE FUNCTION @extschema@.CDB_SetUp_Foreign_Server(fdw_name NAME, config json)
|
||||||
RETURNS void AS $$
|
RETURNS void AS $$
|
||||||
-- TODO Code here
|
DECLARE
|
||||||
$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE;
|
row record;
|
||||||
|
option record;
|
||||||
|
BEGIN
|
||||||
|
-- TODO: refactor with original function
|
||||||
|
-- This function tries to be as idempotent as possible, by not creating anything more than once
|
||||||
|
-- (not even using IF NOT EXIST to avoid throwing warnings)
|
||||||
|
IF NOT EXISTS ( SELECT * FROM pg_extension WHERE extname = 'postgres_fdw') THEN
|
||||||
|
CREATE EXTENSION postgres_fdw;
|
||||||
|
END IF;
|
||||||
|
-- Create FDW first if it does not exist
|
||||||
|
IF NOT EXISTS ( SELECT * FROM pg_foreign_server WHERE srvname = fdw_name)
|
||||||
|
THEN
|
||||||
|
EXECUTE FORMAT('CREATE SERVER %I FOREIGN DATA WRAPPER postgres_fdw', fdw_name);
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Set FDW settings
|
||||||
|
FOR row IN SELECT p.key, p.value from lateral json_each_text(config->'server') p
|
||||||
|
LOOP
|
||||||
|
IF NOT EXISTS (WITH a AS (select split_part(unnest(srvoptions), '=', 1) as options from pg_foreign_server where srvname=fdw_name) SELECT * from a where options = row.key)
|
||||||
|
THEN
|
||||||
|
EXECUTE FORMAT('ALTER SERVER %I OPTIONS (ADD %I %L)', fdw_name, row.key, row.value);
|
||||||
|
ELSE
|
||||||
|
EXECUTE FORMAT('ALTER SERVER %I OPTIONS (SET %I %L)', fdw_name, row.key, row.value);
|
||||||
|
END IF;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
-- Create specific role for this
|
||||||
|
IF NOT EXISTS ( SELECT 1 FROM pg_roles WHERE rolname = fdw_name) THEN
|
||||||
|
EXECUTE format('CREATE ROLE %I NOLOGIN', fdw_name);
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Create user mapping
|
||||||
|
IF NOT EXISTS ( SELECT * FROM pg_user_mappings WHERE srvname = fdw_name AND usename = fdw_name ) THEN
|
||||||
|
EXECUTE FORMAT ('CREATE USER MAPPING FOR %I SERVER %I', fdw_name, fdw_name);
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Update user mapping settings
|
||||||
|
FOR option IN SELECT o.key, o.value from lateral json_each_text('user_mapping') o LOOP
|
||||||
|
IF NOT EXISTS (WITH a AS (select split_part(unnest(umoptions), '=', 1) as options from pg_user_mappings WHERE srvname = fdw_name AND usename = fdw_name) SELECT * from a where options = option.key) THEN
|
||||||
|
EXECUTE FORMAT('ALTER USER MAPPING FOR %I SERVER %I OPTIONS (ADD %I %L)', fdw_name, fdw_name, option.key, option.value);
|
||||||
|
ELSE
|
||||||
|
EXECUTE FORMAT('ALTER USER MAPPING FOR %I SERVER %I OPTIONS (SET %I %L)', fdw_name, fdw_name, option.key, option.value);
|
||||||
|
END IF;
|
||||||
|
END LOOP;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
-- Grant usage on the wrapper and server to the fdw role
|
||||||
|
EXECUTE FORMAT ('GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw TO %I', fdw_name);
|
||||||
|
EXECUTE FORMAT ('GRANT USAGE ON FOREIGN ON FOREIGN SERVER %I TO %I', fdw_name, fdw_name);
|
||||||
|
|
||||||
|
-- Create schema if it does not exist.
|
||||||
|
IF NOT EXISTS ( SELECT * from pg_namespace WHERE nspname=fdw_name) THEN
|
||||||
|
EXECUTE FORMAT ('CREATE SCHEMA %I', fdw_name);
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Give the fdw role usage permisions over the schema
|
||||||
|
EXECUTE FORMAT ('GRANT USAGE ON SCHEMA %I TO %I', fdw_name, fdw_name);
|
||||||
|
|
||||||
|
-- Grant the fdw role to the caller, and permissions to grant it to others
|
||||||
|
EXECUTE FORMAT ('GRANT %I TO %I WITH ADMIN OPTION', fdw_name, session_user);
|
||||||
|
|
||||||
|
-- TODO: Bring here the remote cdb_tablemetadata
|
||||||
|
|
||||||
|
$$ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE SECURITY DEFINER;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION @extschema@._cdb_dbname_of_foreign_table(reloid oid)
|
CREATE OR REPLACE FUNCTION @extschema@._cdb_dbname_of_foreign_table(reloid oid)
|
||||||
RETURNS TEXT AS $$
|
RETURNS TEXT AS $$
|
||||||
|
|||||||
Reference in New Issue
Block a user