Я регулярно должен удалять все данные из своей базы данных PostgreSQL перед восстанавливанием. Как я сделал бы это непосредственно в SQL?
В данный момент мне удалось придумать SQL-оператор, который возвращает все команды, которые я должен выполнить:
SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Но я не вижу способ выполнить их программно, после того как у меня есть они.
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');
В этом случае, вероятно, было бы лучше просто иметь пустую базу данных, которую вы используете в качестве шаблона, и когда вам нужно обновить, отбросьте существующую базу данных и создайте новую из шаблона.
Можно ли использовать динамический SQL для выполнения каждого оператора по очереди? Для этого вам, вероятно, придется написать сценарий PL / pgSQL.
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html (раздел 38.5.4. Выполнение динамических команд)