如何在 Liquibase 插入更改集中使用 Oracle `user` 和 `sysdate` 函数?

How can I use the Oracle `user` and `sysdate` functions in a Liquibase insert change set?

我有一个 changeSet 看起来与下面的相似:

<changeSet author="cwilliams" id="xxx">
    <insert tableName="SOME_TABLE">
        <!-- ... -->
        <column name="CREATED_BY_USER_NAME" value="user"/>
        <column name="CREATED_DT" valueDate="SYSDATE"/>
        <!-- ... -->
    </insert>
</changeSet>

我想将这两列分别设置为数据库用户名和当前时间。我将 usersysdate 作为示例,但我假设 user 会尝试插入用户名 user 而这不是我想要的。

有没有办法告诉 Liquibase 以与数据库无关的方式为这些值使用底层数据库的函数,如果没有,是否有办法为此目的使用特定的 Oracle 函数?

我不知道,我不使用 Liquibase。

但是,如果您有权访问该架构,则可以创建一个 BEFORE INSERT 数据库触发器,例如

create or replace trigger trg_bi_sometab
  before insert on some_table
  for each row
begin
  :new.created_by_user_name := user;
  :new.created_dt := sysdate;
end trg_bi_sometab;
/

在每次插入时,它会用适当的值填充这些列。

您可以使用 valueComputed 属性:

<changeSet author="cwilliams" id="xxx">
    <insert tableName="SOME_TABLE">
        <!-- ... -->
        <column name="CREATED_BY_USER_NAME" valueComputed="user"/>
        <column name="CREATED_DT" valueComputed="SYSDATE"/>
        <!-- ... -->
    </insert>
</changeSet>

另一种选择是,在为这些列创建 table 时定义默认值,然后将它们完全留在插入中。