with transaction example sql liquibase

transaction - liquibase mysql with sql



Liquibase: ¿Cómo establecer el valor predeterminado de una columna de fecha en "ahora" en formato UTC? (6)

Como liquibase es un registro de cambios común para cualquier base de datos, para convertirlo en genérico no debería depender de ninguna base de datos específica como oracle, postegres, mysql, sino que debería ser lo suficientemente genérico para funcionar con cualquier base de datos.

A continuación se muestra cómo se debe implementar:

<column name="time" type="${type.datetime}" defaultValueComputed="${column.datetime.defaultValue}"/>

Esto debería funcionar para todas las bases de datos, para Oracle, inserta SYSTIMESTAMP como DATA_DEFAULT.

¿Cómo configura el valor predeterminado de una columna de fecha en "ahora" en formato UTC? Creo que la respuesta involucra el atributo defaultValueComputed en el elemento de columna .

La documentación establece:

defaultValueComputed Un valor que se devuelve desde una llamada a función o procedimiento. Este atributo contendrá la función a llamar.

¿A qué lenguaje se supone que se debe escribir la función referida? ¿Java? ¿Se supone que la función es la función de fecha específica del proveedor de la base de datos que quiero usar? ¿Hay más documentación que pueda leer sobre este tema?


En MySQL, para usar una columna DATETIME con fracciones de segundo como DATETIME(6) (microsegundos de precisión), use el valor predeterminado de NOW(6) (precaución: CURRENT_TIMESTAMP(6) por alguna razón, produce un error conmigo usando liquibase 3.5.3 ):

<column name="created_at" type="DATETIME(6)" defaultValueComputed="NOW(6)" > <constraints nullable="false" /> </column>

Tenga en cuenta que el valor se almacenará internamente en UTC, pero se leerá con la configuración de zona horaria del servidor ( @@global.time_zone , @@session.time_zone @@global.time_zone ).


Esto funcionó para mí:

<property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/> <column name="ts" type="timestamp" valueDate="${now}"/>

Lo encontré gracias a esta respuesta: https://.com/a/9100388/3107952


Esto funciona con SQlite:

<column name="last_updated_at" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"> <constraints nullable="false"/> </column>

Agregar ''$ ahora'' no me funcionó. Estoy usando SQlite como el DB.


Tal vez este tema en el foro liquibase ayude?

Creo que defaultValueComputed tomará una función específica de la base de datos para expresar "ahora". En mySQL sería CURRENT_TIMESTAMP por lo que podría tener este aspecto:

<createTable tableName="D_UserSession"> <column name="ts" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/> </createTable>

(Copiado de la publicación del foro).


Utilicé la función del proveedor de la base de datos. Para Oracle es un sysdate :

<column name="create_date" type="DATETIME" valueDate="sysdate" defaultValueComputed="sysdate" />