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

时间:2011-01-28 16:43:01

标签: sql-server hsqldb data-migration

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

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

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

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

谢谢!

3 个答案:

答案 0 :(得分: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中创建的表是会有所不同。

答案 1 :(得分:2)

正如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!

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

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

答案 2 :(得分:0)

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