2017-03-09 7 views
3

データベースを削除して再作成することなく、データベースからすべてのコンテンツを削除したいと考えています。すべてのコンテンツのPostgreSQLデータベースを消去する

私はすべてのスキーマを削除し、「public」を再作成してすべての一時テーブルを削除することが良いスタートです。 「処女」のデータベースに比べてすべてのコンテンツを削除していますか、何か不足していますか?

const systemSchemas = ['pg_toast', 'pg_temp_1', 'pg_toast_temp_1', 'pg_catalog', 'information_schema'] 

return Database.connect(connectionString, db => { 

    // DROP schemas except systemSchemas 
    const schemas = await db.queryRows(`SELECT nspname AS name FROM pg_catalog.pg_namespace ORDER BY nspname`).map(row => row.name).filter(name => { 
    return systemSchemas.includes(name) === false 
    }) 
    await Promise.resolve(schemas).each(name => db.query(`DROP SCHEMA "${name}" CASCADE`)) 

    // DROP temporary tables 
    const sql = `SELECT c.relname AS name FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname like 'pg_temp_%' AND pg_catalog.pg_table_is_visible(c.oid) AND c.relpersistence = 't'` 
    return db.queryRows(sql).each(row => db.query(`DROP TABLE IF EXISTS "${row.name}"`)) 

    // CREATE public schema 
    return db.query(`CREATE SCHEMA public`) 
    .then(() => db.query(`GRANT ALL ON SCHEMA public TO postgres`)) 
    .then(() => db.query(`GRANT ALL ON SCHEMA public TO public`)) 
}) 

答えて

3

より一時的なスキーマがあるかもしれないので、あなただけのpg_temp_1pg_toast_temp_1を除外することはできません。 一時的なものを含むシステム以外のすべてのスキーマを削除するだけで十分だと思われるので、pg_catalog,information_schemapg_toastを除外して一時テーブルを削除しないようにしてください。あなたは、単一のDO Postgresのコマンドでこれを行うことができます

注:

do $$ 
declare 
    schema_name text; 
begin 
    for schema_name in 
     select nspname 
     from pg_catalog.pg_namespace 
     where nspname not in ('pg_catalog', 'information_schema', 'pg_toast') 
    loop 
     execute format('drop schema %s cascade', schema_name); 
    end loop; 
    create schema public; 
    grant all on schema public to postgres; 
    grant all on schema public to public; 
    comment on schema public is 'standard public schema'; 
end; 
$$; 
+0

グレート!ありがとうございました。 – Jacob

関連する問題