【问题标题】:How to remove all database objects for a schema in java?如何删除java中模式的所有数据库对象?
【发布时间】:2018-11-25 12:34:31
【问题描述】:

在 Java 中清理(删除所有对象、表、视图等)的 Oracle 数据库模式的最佳方法是什么?

我可以使用 Oracle 数据库客户端运行 https://stackoverflow.com/a/1690419/812093 之类的东西,但是是否有可以使用的 java 库或工具?我知道我可以读取连接元数据,遍历所有对象并删除它们,但我想知道之前是否有人这样做过,是否有任何现成可用的东西。

我需要这个功能来设置集成测试 - 清理数据库架构 - 针对该架构执行一堆脚本来初始化数据库

【问题讨论】:

    标签: java oracle testing jdbc


    【解决方案1】:

    因为你的问题不清楚,所以我画两个方向:

    方向 1 - 删除所有对象和用户。

    最好的办法是:drop user <user_name_here> cascade; 在具有DROP USER系统权限的用户下运行SQL语句。

    方向 2 - 删除所有对象但仍保留用户(所有角色和权限)

    首先列出所有权限并复制到记事本(例如hr用户):

    SELECT 'GRANT ' || PRIVILEGE || ' ON ' || OWNER || '.' || TABLE_NAME || ' TO ' || GRANTEE || ';'
    FROM DBA_TAB_PRIVS
    WHERE GRANTEE='HR';
    
    SELECT 'GRANT ' || PRIVILEGE || ' TO ' || GRANTEE || ';'
    FROM DBA_SYS_PRIVS
    WHERE GRANTEE='HR';
    
    SELECT 'GRANT ' || GRANTED_ROLE || ' TO ' || GRANTEE
    FROM DBA_ROLE_PRIVS
    WHERE GRANTEE='HR';
    

    然后drop用户级联;

    重新创建用户并运行记事本文件的内容。

    感谢 Alex Poole 的建议!

    【讨论】:

    • 但是你必须重新创建具有所有正确权限等的用户。此外,问题暗示(我认为)OP 正试图删除他们连接的用户的对象(但是我可能对“架构中的架构”读得太多了!)..
    • 抱歉,我一直在寻找与 java 集成更紧密的解决方案。我找到了一个似乎对我很有效的解决方案。我会为它添加一个答案
    【解决方案2】:

    飞行路线

    看起来Flyway 数据库迁移工具提供了我一直在寻找的功能 - 至少如果您想破解 :) 因为我需要该功能只是为了进行集成测试,所以对我来说已经足够了。让我分享我的代码。

    添加 Flyway 和 Oracle 驱动依赖

    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>5.1.1</version>
        <scope>test</scope>
    </dependency>       
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc7</artifactId>
        <version>12.1.0.2</version>
        <scope>provided</scope>
    </dependency>   
    

    执行脚本和清理数据库的主类

    public class ExecuteScriptsAgainstOracle {
    
        public static void main(String args[]) throws Exception, SQLException {
    
            Flyway flyway = new Flyway();
            flyway.setDataSource("jdbc:oracle:thin:@xxx:1521:yyy", "zzz", "zzz");
            flyway.setTable("auto_schema_setup_flyway");
    
            Database<?> database = DatabaseFactory.createDatabase(flyway.getConfiguration(), false);
    
    // clean the database (remove all objects of the schema)
            flyway.clean();
            flyway.setSkipDefaultResolvers(true);
            flyway.setResolvers(new MyMigrationResolver(database, flyway.getConfiguration()));
            flyway.migrate();
        }
    
    }
    

    列出要执行的文件的 MigrationResolver

    包org.flywaydb.core.internal.resolver.sql;

    公共类 MyMigrationResolver 实现 MigrationResolver {

    private Database<?> database;
    private Configuration configuration;
    private int order = 0;
    
    public MyMigrationResolver(Database<?> database, Configuration configuration) {
        this.database = database;
        this.configuration = configuration;
    }
    
    @Override
    public Collection<ResolvedMigration> resolveMigrations() {
    
        Collection<ResolvedMigration> scripts = new LinkedList<ResolvedMigration>();
        scripts.add(script(folder1\\somescript.dml"));
        scripts.add(script("folder2\\someOtherScript.sql"));
    
        return scripts;
    }
    
    private ResolvedMigrationImpl script(String scriptName) {
    
    
        String baseFolder = "target\\scripts\\";
        order++;
    
        ResolvedMigrationImpl migration = new ResolvedMigrationImpl();
        migration.setScript(baseFolder+scriptName);
        migration.setType(MigrationType.SQL);
        migration.setDescription(""+String.format("%03d",order)+" "+scriptName);
        migration.setExecutor(new SqlMigrationExecutor(database,
                new FileSystemResource(migration.getScript(), configuration.getEncoding()),
                new PlaceholderReplacer() {
    
                    @Override
                    public String replacePlaceholders(String input) {
    
                        // just remove parts of the sql that flyway can't deal with
                        input = StringUtils.replace(input, "WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;", "");
                        input = StringUtils.replace(input, "SET DEFINE OFF;", "");
    
                        return input;
                    }
    
                    @Override
                    public Map<String, String> getPlaceholderReplacements() {
                        return null;
                    }
                }
                , configuration));
        return migration;
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 2016-01-13
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      相关资源
      最近更新 更多