Skip to content

Instantly share code, notes, and snippets.

@nZac
Created November 12, 2018 22:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nZac/e110a6da34dbb3860b7b7104a6934cb9 to your computer and use it in GitHub Desktop.
Save nZac/e110a6da34dbb3860b7b7104a6934cb9 to your computer and use it in GitHub Desktop.
Permissioned Template Based PG Database Creation
---------------------------
-- SERVER LEVEL COMMANDS --
---------------------------
-- Create a new template database (we could alter template1 as well).
CREATE DATABASE "template2";
-- This avoids possibly droping the template table
UPDATE pg_database SET datistemplate = true WHERE datname='template2';
-- Revoke CONNECT on template2.public from default permission set
REVOKE ALL ON SCHEMA public FROM public;
----------------
-- NEW APP DB --
----------------
-- Create a new group for the application
CREATE ROLE "app-group";
-- Create a new user for DDL
CREATE USER "app-ddl" IN ROLE "app-group" PASSWORD 'x' CREATEDB INHERIT;
-- Create a new user for application
CREATE USER "app-user" IN ROLE "app-group" PASSWORD 'x' INHERIT;
-- Create a non-user for application
CREATE USER "non-app-user" PASSWORD 'x';
-- Create a new application database
CREATE DATABASE "app-db" OWNER "app-group" TEMPLATE "template2";
-- REVOKE connect on the DATABASE
REVOKE CONNECT ON DATABASE "app-db" FROM PUBLIC;
GRANT CONNECT ON DATABASE "app-db" TO "app-ddl", "app-user";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment