我有一个数据库升级脚本来更改一些列上的数据类型。我想做一个preCondition检查,并且只在ALTER TABLE是DECIMAL数据类型时才调用它,但我想将它更改为INTEGER。找不到这个的预先定义先决条件,而且也无法写入sqlCheck。
preCondition
ALTER TABLE
sqlCheck
3z6pesqy1#
liquibase中列的dataType没有内置的precondition。您可以只检查该列是否存在。如果它已经是您需要的数据类型,则不会抛出错误。
liquibase
dataType
precondition
或
你可以在你的前提条件中使用sqlCheck,它将是这样的:
<preConditions onFail="MARK_RAN"> <not> <sqlCheck expectedResult="DECIMAL"> SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'your_table_name' AND COLUMN_NAME = 'your_column_name' </sqlCheck> </not> </preConditions>
3z6pesqy2#
另一个答案已经提到了如何进行sqlcheck。然而,Teradata的实际SQL将是不同的。在Teradata中,您将使用类似于以下内容的查询,并期望将columnType ='D '用于十进制值
Select ColumnType From DBC.ColumnsV Where databasename='yourdatabasename' and tablename='yourtablename' and columnname='yourcolumnname';
如果您希望使用更易于阅读的列类型而不是类型代码,也可以这样做:
Select Type(tablename.columnname);
bq3bfh9z3#
我知道问题是针对Teradata的,但原则是相同的。我更喜欢SQL文件,所以在变更日志中我有(对于Oracle),是:
<include file="roles.sql" relativeToChangelogFile="true" />
然后在roles.sql中有
roles.sql
--changeset betlista:2022-01-04_2200-87-insert --preconditions onFail:MARK_RAN --precondition-sql-check expectedResult:0 select count(*) from ddh_audit.DDH_USER_ROLE where id = 87; insert into ddh_audit.DDH_USER_ROLE(id, role_name, description) values(87, 'CONTAINERS_READONLY', 'Can read Containers reference data');
大卫添加的查询就可以解决这个问题。我不知道,我也没有尝试过条件是否可以在多行上,我知道--rollback可以。
--rollback
3条答案
按热度按时间3z6pesqy1#
liquibase
中列的dataType
没有内置的precondition
。您可以只检查该列是否存在。如果它已经是您需要的数据类型,则不会抛出错误。或
你可以在你的前提条件中使用
sqlCheck
,它将是这样的:3z6pesqy2#
另一个答案已经提到了如何进行sqlcheck。然而,Teradata的实际SQL将是不同的。
在Teradata中,您将使用类似于以下内容的查询,并期望将columnType ='D '用于十进制值
如果您希望使用更易于阅读的列类型而不是类型代码,也可以这样做:
bq3bfh9z3#
我知道问题是针对Teradata的,但原则是相同的。
我更喜欢SQL文件,所以在变更日志中我有(对于Oracle),是:
然后在
roles.sql
中有
大卫添加的查询就可以解决这个问题。
我不知道,我也没有尝试过条件是否可以在多行上,我知道
--rollback
可以。