Как сделать сценарий Oracle ALTER TABLE MODIFY идемпотентным?

У меня есть этот сценарий миграции;

ALTER TABLE table_name MODIFY (column_name NULL);

Как мне сделать его идемпотентным?


person alpanT    schedule 22.01.2020    source источник
comment
Используйте такие инструменты, как Liquibase или Flyway   -  person a_horse_with_no_name    schedule 22.01.2020
comment
так как у меня есть такие проблемы (stackoverflow.com/questions/59666601/) Я не предпочитаю   -  person alpanT    schedule 22.01.2020


Ответы (1)


Либо вы можете использовать обработчик исключений:

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;

или проверьте NULLABLE в поле зрения USER_TAB_COLUMNS:

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;
person Wernfried Domscheit    schedule 22.01.2020
comment
Просто хотел добавить, что если в SQL * Plus запускается сценарий миграции, вы также можете использовать WHENEVER SQLERROR CONTINUE перед командой в качестве элементарного обработчика исключений. - person kfinity; 22.01.2020
comment
@kfinity да, но тогда он игнорирует любые ошибки, включая те, которые вы, возможно, захотите увидеть. Вот почему я не использовал exception when OTHERS then null; - person Wernfried Domscheit; 22.01.2020