notes/postgres.md

6.5 KiB

Install

PostgreSQL: Linux downloads (Ubuntu)

# Create the file repository configuration:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

# Import the repository signing key:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

# Update the package lists:
sudo apt-get update

# Install the latest version of PostgreSQL.
# If you want a specific version, use 'postgresql-12' or similar instead of 'postgresql':
sudo apt-get -y install postgresql

SSPI

setup for single sign on with SSPI

md5 hash is salted with username in front

Memory

see whats in the buffer cache with pg_buffercache

CREATE EXTENSION pg_buffercache

SELECT
	c.relname,
	COUNT(*) AS buffers
FROM
	pg_class c
INNER JOIN pg_buffercache b ON
	b.relfilenode = c.relfilenode
INNER JOIN pg_database d ON
	( b.reldatabase = d.oid
	AND d.datname = CURRENT_DATABASE())
GROUP BY
	c.relname
ORDER BY
	2 DESC
LIMIT 100;

Alter Column

ALTER TABLE rlarp.pcore ALTER COLUMN pack SET DATA TYPE numeric USING pack::numeric

psql binary for latest version is always used but pg_dump is not, you have to set the default version in ~/.postgresqlrc

PostGIS

quickstart tutorial

https://blog.crunchydata.com/blog/postgis-for-newbies

Move Data Directory

https://www.digitalocean.com/community/tutorials/how-to-move-a-postgresql-data-directory-to-a-new-location-on-ubuntu-18-04

copy the data sudo rsync -av /var/lib/postgresql /target_dir

rename original as a backup sudo mv /var/lib/postgresql/10/main /var/lib/postgresql/10/main.bak

point postgres to the new data directory sudo vim //etc/postgresql/14/main/postgres.conf data_directory = '/mnt/volume_nyc1_01/postgresql/10/main'

remove the old data sudo rm -Rf /var/lib/postgresql/10/main.bak

Special Aggregates

To extract aggregate definitions can select from pg_aggregate

SQL for current aggregates I'm using now:

CREATE OR REPLACE FUNCTION public.jsonb_concat(
    state jsonb,
    concat jsonb)
  RETURNS jsonb AS
$BODY$
BEGIN
    --RAISE notice 'state is %', state;
    --RAISE notice 'concat is %', concat;
    RETURN state || concat;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


CREATE OR REPLACE FUNCTION public.jsonb_concat_distinct_arr(
    state jsonb,
    concat jsonb)
  RETURNS jsonb AS
$BODY$
BEGIN
    --RAISE notice 'state is %', state;
    --RAISE notice 'concat is %', concat;
    RETURN SELECT jsonb_agg(state || concat;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


DROP AGGREGATE IF EXISTS public.jsonb_arr_aggc(jsonb);
CREATE AGGREGATE public.jsonb_arr_aggc(jsonb) (
  SFUNC=public.jsonb_concat,
  STYPE=jsonb,
  INITCOND='[]'
);

DROP AGGREGATE IF EXISTS public.jsonb_obj_aggc(jsonb);
CREATE AGGREGATE public.jsonb_obj_aggc(jsonb) (
  SFUNC=public.jsonb_concat,
  STYPE=jsonb,
  INITCOND='{}'
);

CREATE OR REPLACE FUNCTION public.jsonb_array_add_distinct(_arr jsonb, _add text) RETURNS jsonb AS
$$
DECLARE
    _ret jsonb;

BEGIN

SELECT 
    jsonb_agg(DISTINCT x.ae)
INTO
    _ret
FROM
    (
        SELECT jsonb_array_elements_text(_arr) ae
        UNION ALL 
        SELECT _add ae
    ) x;

RETURN _ret;

END;
$$
language plpgsql
DROP FUNCTION IF EXISTS public.jsonb_array_string_agg;
CREATE FUNCTION public.jsonb_array_string_agg(_arr jsonb, _delim text) RETURNS text AS
$$
DECLARE
    _ret text;

BEGIN

SELECT 
    string_agg(ae.v,_delim)
INTO
    _ret
FROM 
    jsonb_array_elements_text(_arr) ae(v);

return _ret;

END;
$$
LANGUAGE plpgsql;


PSQL

use -E to show definitions of SQL used for \d commands

Descriptions

SELECT
    c.relname table_name,
    td.description table_description,
    n.nspname schema_name,
    a.attname As column_name,
    cd.description column_description
FROM
    pg_class As c
    INNER JOIN pg_attribute As a ON
        c.oid = a.attrelid
    LEFT JOIN pg_namespace n ON
        n.oid = c.relnamespace
    LEFT JOIN pg_tablespace t ON
        t.oid = c.reltablespace
    LEFT JOIN pg_description As cd ON
        cd.objoid = c.oid
        AND cd.objsubid = a.attnum
    LEFT JOIN pg_description As td ON 
        td.objoid = c.oid 
        AND td.objsubid = 0
WHERE
    c.relkind IN('r', 'v')
    --AND a.attname = 'd07txn'
    AND cd.description like '%Transaction Number%'
ORDER BY
    n.nspname,
    c.relname,
    a.attname

Foreign Data Wrapper

CREATE EXTENSION postgres_fdw;

CREATE SERVER hptrow
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'hptrow.me', port '54339', dbname 'ubm');

CREATE USER MAPPING FOR ptrowbridge
SERVER hptrow
OPTIONS (user 'ptrowbridge', password 'gyaswddh1983');

CREATE SCHEMA frlarp;

IMPORT FOREIGN SCHEMA rlarp
FROM SERVER hptrow INTO frlarp;

User DDL

DROP USER IF EXISTS api;

SET password_encryption = 'scram-sha-256';

CREATE ROLE api WITH 
    LOGIN
	NOSUPERUSER
	NOCREATEDB
	NOCREATEROLE
	INHERIT
	NOREPLICATION
	CONNECTION LIMIT -1
	PASSWORD 'api';
	
--------------------grant--------------------------------------------------
    
GRANT USAGE ON SCHEMA lgdat TO api;

GRANT SELECT /*, UPDATE, INSERT, DELETE*/ ON ALL TABLES IN SCHEMA lgdat TO api;

GRANT USAGE ON ALL SEQUENCES IN SCHEMA lgdat TO api;

ALTER DEFAULT PRIVILEGES IN SCHEMA lgdat GRANT SELECT/*, UPDATE, INSERT, DELETE*/ ON TABLES TO api;

ALTER DEFAULT PRIVILEGES IN SCHEMA lgdat GRANT USAGE ON SEQUENCES TO api;

---------------------------revoke---------------------------------------

REVOKE USAGE ON SCHEMA lgdat FROM api;

REVOKE USAGE ON SCHEMA lgdat FROM api;

REVOKE SELECT , UPDATE, INSERT, DELETE ON ALL TABLES IN SCHEMA lgdat FROM api;

REVOKE USAGE ON ALL SEQUENCES IN SCHEMA lgdat FROM api;

ALTER DEFAULT PRIVILEGES IN SCHEMA lgdat REVOKE SELECT, UPDATE, INSERT, DELETE ON TABLES FROM api;

ALTER DEFAULT PRIVILEGES IN SCHEMA lgdat REVOKE USAGE ON SEQUENCES FROM api;