¿La mejor utilidad SQL DDL independiente de la database?

Estoy trabajando en un proyecto para la plataforma .NET y me gustaría admitir varios types de bases de datos. Me gustaría mantener el DDL bajo control de código fuente en un formatting genérico y luego convertirlo a DDL específico de la database para su implementación.

Así que estoy buscando utilidades que conviertan DDL genérico en DDL específico de la database. Idealmente, sería compatible con MSSQL 05/08, MySQL, Oracle, Postgres y DB2 desde el primer momento.

Aquí están las herramientas que he encontrado hasta ahora:

  1. XML a DDL
    • Sin soporte incorporado para MSSQL.
  2. DdlUtils
    • Sin utilidad de command-line. Debe llamarse desde scripts java o ant.
  3. ActiveRecord :: Migración
    • Sin soporte para keys externas
    • No estoy seguro de cómo integrar con el proyecto .net.

¿Alguien tiene experiencia con los que he mencionado o conozco a los demás?

El único que sé que tiene soporte para SQL Server es SQLFairy . Está escrito en Perl y es bastante rico en funciones. XML2DDL es bastante bueno también, pero si no es compatible con su DBMS de elección, no es realmente viable.

La herramienta SchemaExport de NHibernate puede generar un DDL apropiado a partir de las asignaciones OR para cualquiera de los dialectos DBMS admitidos por NHibernate. Sin embargo, como han implicado otros, si trabajas en ese nivel, estás realmente restringido al denominador común bastante débil entre los DBMS.

Utilicé con éxito las migraciones ActiveRecord de Ruby / Rails en Oracle, SQL Server 2005, MySQL y SQLite. Creo que también pude haberlo usado en Access, pero eso puede ser una memory defectuosa. También es compatible con PostgreSQL y db2 que conozco, ya sea "de fábrica" ​​o mediante descarga adicional. Y siempre puedes escribir tu propio adaptador si quieres algo más exótico y deseas un proyecto DIY de autoflagelación …

Funciona muy bien, pero debe aceptar que este es un concepto que limitará su acceso a las características específicas de la plataforma. No solo con AR, sino, con toda probabilidad, con cualquier herramienta multiplataforma que no cueste millones de dólares: por ejemplo, ¿qué haces si tu plataforma objective no admite activadores? O procedimientos almacenados? (MySQL 4.0, por ejemplo, o SQLite). Cualquier sistema multiplataforma tiene que lidiar con problemas como este (adquirí un odio de por vida a Crystal Reports, por ejemplo, después de luchar con una versión que intentó – catastróficamente – aplicar un operador de combinación externa de Oracle en una consulta de SQL Server).

Si se apega a las tablas, los índices y las restricciones más simples, espero que haya una gran variedad de plataforms disponibles para usted. Existe un argumento para sugerir que quizás, en general, debería estar buscando algo más que pueda manejarse fuera de su database. No iré más allá de eso, es un debate algo religioso …

Creo que Liquibase hará lo que quiera, y también administrará los cambios en la database a lo largo del time.

¿Es una característica imprescindible que su aplicación sea completamente independiente de las bases de datos? Parece un poco exagerado creer que se necesita poner tanto esfuerzo en el soporte de esta cantidad de bases de datos. Además, su capa de datos va a ser increíblemente compleja ya que hay diferencias sutiles en cada RDBMS.

Puede get una representación abstracta de tablas y sus relaciones, pero ¿cómo maneja las vistas, los procedimientos almacenados, los activadores, etc.?

DDLUtils parece ser la elección correcta. Funciona muy bien, incluso si el proyecto no está realmente activo en estos días.

La encoding está bien, y no tuve problemas con ella (trabajando en MySQL, Oracle, H2DB, …).

De hecho, no existe ahora una command-line integrada, pero puede iniciar tareas de ant desde command-line o escribir su propio contenedor de command-line (realmente no es tan difícil … lo hice de mi lado, de hecho).

He hecho experimentos básicos con DDLUtils. Probé para Mysql, MSSql y Oracle, funciona bien. revisado para la creación de tablas, restricciones e índices. Se negó a usarlo ya que no está activo y los errores bloqueadores están abiertos desde hace mucho time.