FIX: Restore failed if schema contained objects not owned by the current DB user
diff --git a/lib/backup_restore.rb b/lib/backup_restore.rb
index 4775fdd..4d75734 100644
--- a/lib/backup_restore.rb
+++ b/lib/backup_restore.rb
@@ -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};';
diff --git a/lib/backup_restore/backuper.rb b/lib/backup_restore/backuper.rb
index ae7cee8..dd4f81c 100644
--- a/lib/backup_restore/backuper.rb
+++ b/lib/backup_restore/backuper.rb
@@ -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
GitHub sha: 13b4eb9c