Используя PostgreSQL 9.2.8, я пытаюсь восстановить только мои данные из одной базы данных в другую, но триггеры, похоже, все еще работают. Я написал сценарий, показанный ниже, чтобы сделать копию.pg_restore не отключает триггеры
В основном у меня есть dts
как моя производственная база данных, и у меня есть DigitalTrafficSystem
как моя база данных разработки. Структуры таблиц одинаковы, но у разработчика есть очень разные хранимые процедуры.
Когда восстановление выполняется, база данных DigitalTrafficSystem
заканчивается кучей дополнительных строк таблицы, которых нет в базе данных dts
, поэтому я предполагаю, что они создаются триггерами.
Сообщения я получаю связанные с триггерами, для каждой таблицы, выглядеть так:
pg_restore: [archiver (db)] could not execute query: ERROR: permission denied: "RI_ConstraintTrigger_c_136691" is a system trigger
Command was: ALTER TABLE usage ENABLE TRIGGER ALL;
Я предполагаю, что триггеры отключены, но только что триггер уровень системы не может (ошибочно?) отключиться.
Вот мой сценарий:
#!/bin/sh
PGUSER=dts
FILE=/tmp/.dts.db.$$
# Dump the schema of the DB as we want this to keep
pg_dump -s DigitalTrafficSystem -f $FILE
dropdb -U _postgres DigitalTrafficSystem
if [ $? -ne 0 ]; then
exit;
fi
createdb -U _postgres -O dts DigitalTrafficSystem
if [ $? -ne 0 ]; then
exit;
fi
# Restore the schema
psql -d DigitalTrafficSystem -f $FILE
# Dump the data of the real production database
pg_dump -Fc -a dts -f $FILE > /dev/null
if [ $? -ne 0 ]; then
exit;
fi
# Restore only the data from the real database to our development one
pg_restore -a -d DigitalTrafficSystem --disable-triggers -S dts $FILE
rm $FILE
Это определенно триггеры. Я запустил все, кроме последнего pg_restore, открыл базу данных и вручную удалил все триггеры, затем выполнил команду pg_restore, и у меня нет неверных данных. Очевидно, я не могу делать это вручную каждый раз, когда я хочу переписать базу данных. – Gargoyle
Похоже, вы пытаетесь восстановить -data-only в пустую базу данных (только что созданное и не содержащее таблиц). Вам также понадобятся определения таблиц в вашей целевой БД, вы не можете вставлять их в несуществующие столы. – wildplasser
Как-то я пропустил копирование в 'psql -d DigitalTrafficSystem -f $ FILE', который запускается после создания базы данных, которая восстанавливается на основе сбрасываемой схемы. – Gargoyle