mirror of
https://github.com/discourse/discourse.git
synced 2025-05-21 18:12:32 +08:00
FIX: Restore failed if schema contained objects not owned by the current DB user
This commit is contained in:
@ -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};';
|
||||
|
Reference in New Issue
Block a user