FIX: Restore failed if schema contained objects not owned by the current DB user

This commit is contained in:
Gerhard Schlager 2020-03-31 15:07:52 +02:00
parent 0d646d1a26
commit 13b4eb9cce
2 changed files with 7 additions and 4 deletions

View File

@ -83,12 +83,14 @@ module BackupRestore
end
def self.move_tables_between_schemas(source, destination)
owner = database_configuration.username
ActiveRecord::Base.transaction do
DB.exec(move_tables_between_schemas_sql(source, destination))
DB.exec(move_tables_between_schemas_sql(source, destination, owner))
end
end
def self.move_tables_between_schemas_sql(source, destination)
def self.move_tables_between_schemas_sql(source, destination, owner)
<<~SQL
DO $$DECLARE row record;
BEGIN
@ -97,13 +99,13 @@ module BackupRestore
-- otherwise extensions (like hstore & pg_trgm) won't work anymore...
CREATE SCHEMA IF NOT EXISTS #{destination};
-- move all <source> tables to <destination> schema
FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = '#{source}'
FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = '#{source}' AND tableowner = '#{owner}'
LOOP
EXECUTE 'DROP TABLE IF EXISTS #{destination}.' || quote_ident(row.tablename) || ' CASCADE;';
EXECUTE 'ALTER TABLE #{source}.' || quote_ident(row.tablename) || ' SET SCHEMA #{destination};';
END LOOP;
-- move all <source> views to <destination> schema
FOR row IN SELECT viewname FROM pg_views WHERE schemaname = '#{source}'
FOR row IN SELECT viewname FROM pg_views WHERE schemaname = '#{source}' AND viewowner = '#{owner}'
LOOP
EXECUTE 'DROP VIEW IF EXISTS #{destination}.' || quote_ident(row.viewname) || ' CASCADE;';
EXECUTE 'ALTER VIEW #{source}.' || quote_ident(row.viewname) || ' SET SCHEMA #{destination};';

View File

@ -194,6 +194,7 @@ module BackupRestore
[ password_argument, # pass the password to pg_dump (if any)
"pg_dump", # the pg_dump command
"--schema=public", # only public schema
"-T public.pg_*", # exclude tables and views whose name starts with "pg_"
"--file='#{@dump_filename}'", # output to the dump.sql file
"--no-owner", # do not output commands to set ownership of objects
"--no-privileges", # prevent dumping of access privileges