Liquibase генерирует разные UUID, хотя uuid () вызывается один раз внутри <property> - PullRequest
0 голосов
/ 02 ноября 2018

Мы запустили следующее в Liquibase:

<property name="UUID-20-off-General-US" value="uuid()" dbms="mysql"/>
<changeSet id="GeneralDiscountRateCard20" author="foo">
    <sql dbms="mysql">
        INSERT INTO rate (id, pricing_model, name)
        VALUES (${UUID-20-off-General-US}, 'CPM', '20% off Discount US');
        INSERT INTO rate_map (id, rate_map_name, rate_id)
        VALUES (uuid(), 'general_20_discount_us', ${UUID-20-off-General-US})
    </sql>
</changeSet>

Мы ожидали увидеть одинаковый UUID, используемый в обеих таблицах (и другой UUID для id второй таблицы). Вместо этого мы нашли 3 разных UUID. Они выглядели почти одинаково, отличаясь только цифрами 5-8:

0dec159a-ded8-11e8-813e-42010a80044f
0dec7a69-ded8-11e8-813e-42010a80044f
0decc891-ded8-11e8-813e-42010a80044f
    ^^^^

Предположительно, потому что uuid() был вызван примерно за ту же долю секунды.

Имеет ли <property> отложенную интерполяцию? Есть ли способ на самом деле иметь одинаковые UUID между двумя ссылками на <property>?

1 Ответ

0 голосов
/ 06 ноября 2018

Вызов uuid() вернет различные идентификаторы UUID, даже если они используются в одном запросе.

MariaDB [(none)]> SELECT uuid(), uuid();
+--------------------------------------+--------------------------------------+
| uuid()                               | uuid()                               |
+--------------------------------------+--------------------------------------+
| c6996867-e19c-11e8-b32e-e0cb4eeb0025 | c699686c-e19c-11e8-b32e-e0cb4eeb0025 |
+--------------------------------------+--------------------------------------+

Когда вы выполняете свои запросы, вы получите следующие операторы SQL:

INSERT INTO rate (id, pricing_model, name)
VALUES (uuid(), 'CPM', '20% off Discount US');
INSERT INTO rate_map (id, rate_map_name, rate_id)
VALUES (uuid(), 'general_20_discount_us', uuid())

, что приводит к трем различным UUID. Когда вы хотите «повторно использовать» значение, вы должны сохранить значение, а не вызов функции, внутри переменной / свойства и использовать вместо этого что-то вроде этого:

<property name="UUID-20-off-General-US" value="'c699686c-e19c-11e8-b32e-e0cb4eeb0025'" dbms="mysql"/>
<changeSet id="GeneralDiscountRateCard20" author="foo">
    <sql dbms="mysql">
        INSERT INTO rate (id, pricing_model, name)
        VALUES (${UUID-20-off-General-US}, 'CPM', '20% off Discount US');
        INSERT INTO rate_map (id, rate_map_name, rate_id)
        VALUES (uuid(), 'general_20_discount_us', ${UUID-20-off-General-US})
    </sql>
</changeSet>

Или вы не используете жесткий код <property /> и передаете вычисленное значение через Ant или командную строку.

...