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

Sql server 创建有效的SQL脚本以生成SQL Server数据库,sql-server,hsqldb,data-migration,Sql Server,Hsqldb,Data Migration,我正在测试一个利用SQL Server数据库的应用程序。出于测试目的,我真的希望能够利用内存中的数据库,比如HSQL。事实上,我已经运行了测试,但还有一个难点仍然没有解决——我很难生成一个SQL脚本,可以用来构建我的HSQL数据库。由于该系统仍处于开发阶段,数据库更改可能发生,也确实发生,因此我不想将所有时间都花在手动更新SQL脚本上 在SQLServerManagementStudio中,我可以生成一个脚本来构建该数据库。但是,该脚本包含许多特定于SQL Server的“内容”。因此,我不能将

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

在SQLServerManagementStudio中,我可以生成一个脚本来构建该数据库。但是,该脚本包含许多特定于SQL Server的“内容”。因此,我不能将该脚本带到HSQL并让它执行。相反,我需要花很多时间删除在HSQL中不起作用的东西

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

有谁能推荐一种方法(工具、流程等),我可以用它来指向SQL Server数据库,并为自己生成一个脚本,用HSQL构建完全相同的数据库


谢谢

有用于跨引擎数据库迁移的工具。一个可以完成这项工作的工具是

假设您正在使用Hibernate,您可以在testcase中配置Hibernate,以便在创建
会话工厂时创建表

<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文件。。。
...
org.hibernate.dialogue.hsql方言
...
创造

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

作为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>
这实际上非常有效,因为我可以通过利用占位符和PropertyConfiger构造重用几乎所有的生产配置文件。我的测试环境只需要propertyconfiguer配置文件和它们指向的属性文件

谢谢,limc

另外,我确实看到了limc提到的问题。该系统设计用于连接到生产中的SQL Server数据库,该数据库不会通过hbm2ddl创建。因此,如果我的HBM文件中有错误,我的测试可能都可以正常工作,而我在生产中可能仍然会失败


一方面,我对此很不满意,但另一方面,我可以用一种完全独立的方式对DB运行测试用例。在这个解决方案中,有人可以在不受源代码控制的情况下检查这个项目,并立即运行测试用例,而无需进行任何类型的数据库设置。我也喜欢。不幸的是,我还没有找到一种同时拥有两者的好方法。

假设您可以通过ODBC连接到HSQL,您可以创建一个数据库,并将表和数据转储到HSQL中。然后应该有基于现有数据库/模式生成脚本的HSQL工具。
<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>
db.dialect=org.hibernate.dialect.HSQLDialect
ddl.create=create