如何使Oracle ALTER TABLE修改脚本是幂等的?

如何使Oracle ALTER TABLE修改脚本是幂等的?,oracle,database-migration,ddl,idempotent,Oracle,Database Migration,Ddl,Idempotent,我有这个迁移脚本 ALTER TABLE table_name MODIFY (column_name NULL); 如何使其幂等?您可以使用异常处理程序: DECLARE CANNOT_MODIFIY_TO_NULL EXCEPTION; PRAGMA EXCEPTION_INIT(CANNOT_MODIFIY_TO_NULL, -1451); BEGIN EXECUTE IMMEDIATE 'ALTER TABLE TABLE_NAME MODIFY (colum

我有这个迁移脚本

ALTER TABLE table_name MODIFY (column_name NULL);

如何使其幂等?

您可以使用异常处理程序:

DECLARE
    CANNOT_MODIFIY_TO_NULL EXCEPTION;
    PRAGMA EXCEPTION_INIT(CANNOT_MODIFIY_TO_NULL, -1451);
BEGIN

    EXECUTE IMMEDIATE 'ALTER TABLE TABLE_NAME MODIFY (column_name  NULL)';
exception
    when CANNOT_MODIFIY_TO_NULL then
        NULL;
END;
或者在视图的用户选项卡列中选中可为空的
USER

DECLARE

    CURSOR Cols IS
    SELECT COLUMN_NAME 
    FROM USER_TAB_COLUMNS 
    WHERE TABLE_NAME = 'TABLE_NAME' 
        AND NULLABLE = 'N' 
        AND COLUMN_NAME = 'COLUMN_NAME';

BEGIN
    FOR aCol IN Cols LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE TABLE_NAME MODIFY ('||aCol.COLUMN_NAME||' NULL)';
    END LOOP;
END;

您可以使用异常处理程序:

DECLARE
    CANNOT_MODIFIY_TO_NULL EXCEPTION;
    PRAGMA EXCEPTION_INIT(CANNOT_MODIFIY_TO_NULL, -1451);
BEGIN

    EXECUTE IMMEDIATE 'ALTER TABLE TABLE_NAME MODIFY (column_name  NULL)';
exception
    when CANNOT_MODIFIY_TO_NULL then
        NULL;
END;
或者在视图的用户选项卡列中选中可为空的
USER

DECLARE

    CURSOR Cols IS
    SELECT COLUMN_NAME 
    FROM USER_TAB_COLUMNS 
    WHERE TABLE_NAME = 'TABLE_NAME' 
        AND NULLABLE = 'N' 
        AND COLUMN_NAME = 'COLUMN_NAME';

BEGIN
    FOR aCol IN Cols LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE TABLE_NAME MODIFY ('||aCol.COLUMN_NAME||' NULL)';
    END LOOP;
END;

使用像Liquibase或Flyway这样的工具因为我有这类问题()我不喜欢使用像Liquibase或Flyway这样的工具因为我有这类问题()我不喜欢只想补充一点,如果它是在SQL*Plus中运行的迁移脚本,只要SQLERROR CONTINUE在命令之前,您也可以将其作为基本的异常处理程序使用。@kfinity yes,但是它会忽略任何错误,包括您可能希望看到的错误。这就是为什么我没有在别人为空时使用
exception的原因
只是想补充一点,如果是在SQL*Plus中运行的迁移脚本,您也可以在SQLERROR继续执行之前使用
作为基本的异常处理程序。@kfinity yes,但是它会忽略任何错误,包括您可能希望看到的错误。这就是为什么我没有在别人为空时使用
exception的原因