koopa-admin-log/scripts/taler-shared/goa-regio-ng/goa-pg-acl-fixup.sh

44 lines
1.6 KiB
Bash
Executable file

#!/usr/bin/env bash
# After pg_restore --no-owner --no-acl: give app role full rights on non-system schemas.
# Do NOT ALTER SEQUENCE OWNER for serials linked to tables (Postgres rejects that);
# ALTER TABLE OWNER covers owned serials.
# Usage inside CTR: goa-pg-acl-fixup.sh <dbname> <owner_role>
set -euo pipefail
db="${1:?db}"
owner="${2:?owner}"
# owner is a fixed role name from the restore caller (no user input).
runuser -u postgres -- psql -d "$db" -v ON_ERROR_STOP=1 <<SQL
DO \$\$
DECLARE
r record;
own text := '${owner}';
BEGIN
FOR r IN
SELECT nspname
FROM pg_namespace
WHERE nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
AND nspname NOT LIKE 'pg_temp_%'
AND nspname NOT LIKE 'pg_toast_temp_%'
LOOP
EXECUTE format('ALTER SCHEMA %I OWNER TO %I', r.nspname, own);
EXECUTE format('GRANT ALL ON SCHEMA %I TO %I', r.nspname, own);
EXECUTE format('GRANT ALL ON ALL TABLES IN SCHEMA %I TO %I', r.nspname, own);
EXECUTE format('GRANT ALL ON ALL SEQUENCES IN SCHEMA %I TO %I', r.nspname, own);
EXECUTE format('GRANT ALL ON ALL FUNCTIONS IN SCHEMA %I TO %I', r.nspname, own);
END LOOP;
FOR r IN
SELECT n.nspname, c.relname
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'v', 'm', 'p')
AND n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
AND n.nspname NOT LIKE 'pg_temp_%'
AND n.nspname NOT LIKE 'pg_toast_temp_%'
LOOP
EXECUTE format('ALTER TABLE %I.%I OWNER TO %I', r.nspname, r.relname, own);
END LOOP;
END
\$\$;
SQL
echo "ACL_FIX_OK db=$db owner=$owner"