So duplizieren Sie schemas in PostgreSQL
Ich habe eine Datenbank mit schema public
und schema_A
. Ich brauche ein neues schema zu erstellen schema_b
mit der gleichen Struktur als schema_a
.
Ich fand die Funktion unten, das problem ist, dass Sie nicht kopieren Sie die foreign key-Einschränkungen.
CREATE OR REPLACE FUNCTION clone_schema(source_schema text, dest_schema text)
RETURNS void AS
$BODY$
DECLARE
object text;
buffer text;
default_ text;
column_ text;
BEGIN
EXECUTE 'CREATE SCHEMA ' || dest_schema ;
-- TODO: Find a way to make this sequence's owner is the correct table.
FOR object IN
SELECT sequence_name::text FROM information_schema.SEQUENCES WHERE sequence_schema = source_schema
LOOP
EXECUTE 'CREATE SEQUENCE ' || dest_schema || '.' || object;
END LOOP;
FOR object IN
SELECT table_name::text FROM information_schema.TABLES WHERE table_schema = source_schema
LOOP
buffer := dest_schema || '.' || object;
EXECUTE 'CREATE TABLE ' || buffer || ' (LIKE ' || source_schema || '.' || object || ' INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING DEFAULTS)';
FOR column_, default_ IN
SELECT column_name::text, REPLACE(column_default::text, source_schema, dest_schema) FROM information_schema.COLUMNS WHERE table_schema = dest_schema AND table_name = object AND column_default LIKE 'nextval(%' || source_schema || '%::regclass)'
LOOP
EXECUTE 'ALTER TABLE ' || buffer || ' ALTER COLUMN ' || column_ || ' SET DEFAULT ' || default_;
END LOOP;
END LOOP;
END;
$BODY$ LANGUAGE plpgsql
Wie kann ich Klonen/kopieren schema_A
mit der foreign key-Einschränkungen?
InformationsquelleAutor der Frage Cristhian Boujon | 2013-08-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie wahrscheinlich tun Sie es von der Kommandozeile aus ohne Verwendung von Dateien:
pg_dump -U user --schema='fromschema' database | sed 's/fromschmea/toschema/g' | psql -U user -d database
Hinweisdass dies sucht und ersetzt alle vorkommen der Zeichenfolge, ist Ihrem schema name, so es kann auf Ihre Daten.
InformationsquelleAutor der Antwort user1517922
Ich würde
pg_dump
- dump-schema ohne Daten:Dann benennen Sie das schema in die dump (suchen & ersetzen) und es wieder mit
psql
.Foreign key-Einschränkungen verweisen auf Tabellen in anderen schemas kopiert wurden, zeigen das gleiche schema.
Verweise auf Tabellen innerhalb des gleichen schema zeigen Sie auf die entsprechenden Tabellen innerhalb der schema kopiert.
InformationsquelleAutor der Antwort Erwin Brandstetter
Ein bisschen spät, um der Partei, aber einige sql hier könnte helfen, Sie auf Ihrem Weg:
get oid schema:
erhalten Tabelle oid:
bekommen foreign key-Einschränkungen:
Eine gute Ressource für PostgreSQL-system-Tabellen finden Sie hier. Darüber hinaus können Sie lernen, mehr über die internen Abfragen
pg_dump
macht zu sammeln, die dump-Informationen anzeigen, indem Sie es Quellcode.Wahrscheinlich der einfachste Weg, um zu sehen, wie
pg_dump
sammelt alle Ihre Daten zu verwendenstrace
auf, etwa so:Werden Sie noch haben, um durch den Morast der Aussagen, aber es sollte Ihnen helfen Stück zusammen ein Klonen-Werkzeug programmgesteuert und vermeiden, fallen zu lassen, um eine shell aufrufen
pg_dump
.InformationsquelleAutor der Antwort rabbitt
Werde ich teilen eine Lösung für mein problem, das war das gleiche mit einem kleinen Zusatz. Ich musste clone-a-schema, erstellen Sie eine neue Datenbank-Benutzer, und weisen Sie den Besitz aller Objekte in dem neuen schema zu diesem Benutzer.
Für das folgende Beispiel nehmen wir an, dass das Referenz-schema genannt wird ref_schema und die Ziel-schema new_schema. Das Referenz-schema und alle Objekte im Besitz von einem Benutzer namens ref_user.
1. dump das Referenz-schema mit pg_dump:
2. erstellen Sie einen neuen Datenbankbenutzer mit dem Namen new_user:
3. benennen Sie das schema ref_schema zu new_schema:
4. änderung der Inhaberschaft für alle Objekte im schema umbenannt, um den neuen Benutzer
5. wiederherstellen der ursprünglichen Referenz-schema-von der Müllkippe
Ich hoffe jemand findet dies sehr hilfreich.
InformationsquelleAutor der Antwort Adam