Усечение всех таблиц в базе данных Postgres

Я регулярно должен удалять все данные из своей базы данных PostgreSQL перед восстанавливанием. Как я сделал бы это непосредственно в SQL?

В данный момент мне удалось придумать SQL-оператор, который возвращает все команды, которые я должен выполнить:

SELECT 'TRUNCATE TABLE ' ||  tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';

Но я не вижу способ выполнить их программно, после того как у меня есть они.

142
задан Erwin Brandstetter 23 October 2015 в 04:03
поделиться

3 ответа

FrustratedWithFormsDesigner правильный, PL / pgSQL может это сделать. Вот сценарий:

CREATE OR REPLACE FUNCTION truncate_tables(username IN VARCHAR) RETURNS void AS $$
DECLARE
    statements CURSOR FOR
        SELECT tablename FROM pg_tables
        WHERE tableowner = username AND schemaname = 'public';
BEGIN
    FOR stmt IN statements LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ' CASCADE;';
    END LOOP;
END;
$$ LANGUAGE plpgsql;

Это создает сохраненную функцию (вам нужно сделать это только один раз), которую впоследствии можно использовать следующим образом:

SELECT truncate_tables('MYUSER');
206
ответ дан 23 November 2019 в 23:02
поделиться

В этом случае, вероятно, было бы лучше просто иметь пустую базу данных, которую вы используете в качестве шаблона, и когда вам нужно обновить, отбросьте существующую базу данных и создайте новую из шаблона.

9
ответ дан 23 November 2019 в 23:02
поделиться

Можно ли использовать динамический SQL для выполнения каждого оператора по очереди? Для этого вам, вероятно, придется написать сценарий PL / pgSQL.

http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html (раздел 38.5.4. Выполнение динамических команд)

3
ответ дан 23 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: