首页 文章

创建有效的SQL脚本以生成SQL Server数据库

提问于
浏览
2

我正在测试使用SQL Server数据库的应用程序 . 出于测试目的,我真的希望能够使用内存数据库,如HSQL . 我实际上已经运行了测试但是我仍有一个难点 - 我很难生成可用于构建HSQL数据库的SQL脚本 . 由于此系统仍处于开发阶段,因此可以并且确实发生了数据库更改,因此我不想花费所有时间手动更新SQL脚本 .

在SQL Server Management Studio中,我可以生成一个脚本来构建该数据库 . 但是,该脚本包含许多SQL Server特定的“内容” . 因此,我不能将该脚本带到HSQL并让它执行 . 相反,我需要花费大量时间来撕掉那些在HSQL中不起作用的东西 .

一位同事建议使用PowerBuilder来生成脚本,虽然它生成的脚本有点干净,但它仍然不会在HSQL中“按原样”运行 .

任何人都可以建议一个方法(工具,过程等),我可以用它指向SQL Server数据库并生成一个脚本,将在HSQL中构建完全相同的数据库?

谢谢!

3 回答

  • 2

    假设您正在使用Hibernate,您可以在测试用例中配置Hibernate以在创建 sessionFactory 时创建表 .

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mappingResources">
            <list>
                <value>...hbm file...</value>
                ...
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
                ...
                <prop key="hibernate.hbm2ddl.auto">create</prop>
            </props>
        </property>
    </bean>
    

    此方法的唯一缺点是,如果您的HBM文件没有与物理SQL Server数据库匹配的设置(例如,您省略了HBM文件中的某些约束或列),那么HSQL中创建的表将是不同 .

  • 0

    正如limc给出的答案的后续行动一样,这就是我能够做到的 .

    我正在使用Spring和Hibernate,所以我能够获取我的Spring数据配置文件并将其转换为:

    <bean id="sessionFactory" name="sessionFactory" 
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
        <list>
        ...hbm files...
        </list>
    </property>
    <property name="hibernateProperties">
    <props>
        <prop key="hibernate.dialect">${db.dialect}</prop>
        <prop key="hibernate.show_sql">false</prop>
        <prop key="hibernate.format_sql">true</prop>
        <prop key="hibernate.use_sql_comments">false</prop> 
        <prop key="hibernate.hbm2ddl.auto">${ddl.create}</prop>
    </props>
    </property>
    </bean>
    

    有了这个,我能够使用propertyConfigurer配置来填充占位符,如下所示:

    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <bean id="propertyConfigurer" 
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="location">
                <value>classpath:test-messages.properties</value>
            </property>
        </bean>
    
    </beans>
    

    我有一个用于测试的文件,还有一个用于我的 生产环境 代码 . 上面显示的是我的测试版本,并引用文件test-messages.properties,如下所示:

    db.dialect=org.hibernate.dialect.HSQLDialect
    ddl.create=create
    

    这实际上非常好用,因为我可以通过利用占位符和propertyConfigurer构造重用几乎所有的 生产环境 配置文件 . 我的测试环境需要的唯一额外文件是propertyConfigurer配置文件和它们指向的属性文件 .

    谢谢,限制!

    顺便说一句,我确实看到了limc提到的问题 . 此系统旨在部署以连接到 生产环境 中的SQL Server数据库,该数据库不会通过hbm2ddl创建 . 所以,如果我的HBM文件中有错误,我的测试可能都可以正常工作,而我可能仍会在 生产环境 中出现故障 .

    一方面,我对此非常不满,但另一方面,我实际上可以以完全独立的方式对数据库运行测试用例 . 有了这个解决方案,有人可以从源代码控制中检查这个项目,并立即运行测试用例,而无需进行任何类型的数据库设置 . 我也喜欢那个 . 不幸的是,我还没有找到一个非常棒的方法 .

  • 2

    有用于跨引擎数据库迁移的工具 . 一个可以完成这项工作的工具是http://liquibase.org/

相关问题