Существуют разные подходы, в зависимости от деталей.
Один из тривиальных подходов подходит только в том случае, если вы уже знаете точное имя ограничения и имя таблицы-схемы + имя таблицы, - это удаление ограничения при игнорировании ошибки, если она не существует (см. Пример ниже).
Пример удаления уникального ограничения с использованием составного SQL, который игнорирует случай, когда ограничение еще не существует. Вы можете определить другие условия, чтобы игнорировать. Этот составной SQL может быть выполнен непосредственно в CLP или может быть реплицирован внутри хранимой процедуры.
--#SET TERMINATOR @
begin
declare v_no_such_constraint integer default 0;
declare not_exists condition for sqlstate '42704';
declare continue handler for not_exists set v_no_such_constraint=1;
execute immediate('alter table user1.mytable drop constraint myuniqueconstraint') ;
end@
Примечание: так как это изменение таблицы, ваш код должен проверить, переводит ли изменение в таблицу в ожидание перерегистрации, а затем реагировать соответствующим образом. Кроме того, это предполагает, что у вас также есть инструментальные средства, которые будут повторно проверять любые объекты (например, пакеты), которые становятся недействительными в результате удаления этого ограничения.
Если вы не знаете имя ограничения, а только имя таблицы и тип ограничения (например, столбцы, на которые влияют), тогда вы можете искать в представлениях каталога, объединяя syscat.tables, syscat.tabconst, syscat.checks
и другие представления. Подробнее см. Центр знаний для вашей версии Db2.