![Упрощение создания и очистки объекта с помощью, если [не] существует в базе данных Oracle 23AI](https://hackernoon.imgix.net/images/lh3GIz5KYbVlETykJ0q4yOt71CA3-su138jh.jpeg)
Упрощение создания и очистки объекта с помощью, если [не] существует в базе данных Oracle 23AI
11 июня 2025 г.Oracle Database 23AI вводит долгожданное улучшение для управления объектами базы данных изящно поддерживает поддержкуIF [NOT] EXISTS
пункт в заявлениях DDL. Это улучшение упрощает управление схемами, предотвращая ошибки времени выполнения при создании или сбросе объектов, которые могут или не могут уже существовать. Для DBAS и разработчиков, создающих многоразовые, идентификационные сценарии развертывания, эта функция знаменует собой значительную веху в удобстве использования.
Давайте пройдемся через это улучшение, используя практические примеры, сравнивая, как этот пункт смягчает ошибки создания объектов и удаления, которые в противном случае нарушали бы развертывания приложений или задачи обновления схемы.
Настройка: подготовка схемы тестирования и объектов
Мы начинаем с создания специальной схемы тестирования. Эти операции предполагают, что контейнерная база данных названаfreepdb1
и выполняются как пользователь SYSDBA. Этот подход позволяет тестировать как чувствительные к привилегии, так и на уровне схемы.
-- Connect as SYS
conn sys/SysPassword1@//localhost:1521/freepdb1 as sysdba
-- Create test user and grant privileges
create user testuser1 identified by testuser1;
grant connect, resource to testuser1;
Переключившись на нового пользователя, мы готовим некоторые объекты схемы для наших демонстраций:
-- Connect as testuser1
conn testuser1/testuser1@//localhost:1521/freepdb1
-- Create sample objects
create table t1 (id number);
create sequence t1_seq;
create view t1_v as
select * from t1;
create procedure p1 as
begin
null;
end;
/
Проблема: традиционные ограничения DDL
В более ранних версиях Oracle, создание или сброс объектов базы данных без сначала проверки их существования часто приводит к ошибкам времени выполнения. Это долгое время было проблемой в написании многоразовых сценариев развертывания или автоматизации CI/CD.
Например, попытка воссоздать пользователяTESTUSER1
или таблицаT1
Без проверки это вызвало бы ошибки, такие как:
create user testuser1 identified by testuser1;
-- ORA-01920: user name 'TESTUSER1' conflicts with another user or role name
create table t1 (id number);
-- ORA-00955: name is already used by an existing object
drop table t3 purge;
-- ORA-00942: table or view does not exist
Эти сбои останавливают сценарии и требуют условной логики, делая развертывание более хрупкими и словесными.
Решение: если [не] существует
С Oracle 23AI у нас теперь есть более чистое, более декларативное решение. АIF NOT EXISTS
пункт позволяет нам подавлять ошибки при попытке создать существующие объекты, в то время какIF EXISTS
Это делает то же самое при сбрасывании объектов, которые могут не существовать.
Вот упрощенный пример управления пользователями:
-- Connect as SYS again
conn sys/SysPassword1@//localhost:1521/freepdb1 as sysdba
create user if not exists testuser1 identified by testuser1;
-- Output: User created.
drop user if exists testuser3 cascade;
-- Output: User dropped.
Точно так же создание и удаление объекта в схеме становится простым:
-- Back to testuser1
conn testuser1/testuser1@//localhost:1521/freepdb1
create table if not exists t1 (id number);
create sequence if not exists t1_seq;
create view if not exists t1_v as
select * from t1;
create procedure if not exists p1 as
begin
null;
end;
/
Отбрасывание несуществующих объектов больше не требует сложных проверок:
drop table if exists t3;
drop sequence if exists t3_seq;
drop view if exists t3_v;
drop procedure if exists p3;
Все они выполняются чисто, даже если целевой объект отсутствует.
Создать или заменить: ограничение, чтобы отметить
АCREATE OR REPLACE
Синтаксис - совместно используется для представлений, процедур и функций - быть объединенным сIF NOT EXISTS
Полем Попытки сделать это вынесут ошибку:
create or replace view if not exists t1_v as
select * from t1;
-- ORA-11541: REPLACE and IF NOT EXISTS cannot coexist in the same DDL statement
Это ограничение подчеркивает, чтоIF NOT EXISTS
предназначен как простая проверка присутствия, а не механизм для условной замены существующих объектов.
Тонкая ловушка: альтернативные операторы не полностью защищены
Хотя вы можете использоватьIF EXISTS
вALTER
Заявления о существовании таблицы. Он не защищает от конфликтов нижнего уровня, таких как попытка добавить столбец, который уже существует:
alter table if exists t1 add (id number);
-- ORA-01430: column being added already exists in table
Это связано с тем, что Oracle проверяет только существование таблицы, а не определение внутренней схемы ее столбцов.
Соображения при использовании, если [не] существует
Этот новый пункт является изменчивым изменением игры для сценариев развертывания и очистки и очистки, но это не без предостережения. При генерации аудиторских троп или журналов вывод может вводить в заблуждение. Например, вы получите сообщения «созданный пользователем» или «таблица, выпавшие», даже если действие было пропущено из -за присутствия объекта или отсутствия.
Кроме того, обратите внимание, что этот пункт выполняет проверку присутствия только по имени объекта; он не сравнивает структуру или совместимость. Поэтому вы не можете использовать его для обнаружения изменений или дрейфа в определениях объектов.
Кроме того, различные версии клиентских инструментов (такие как SQLCL, SQL Developer или SQL Developer Web) могут отображать различные выходы для этих операций. Обновление до последних версий обеспечивает последовательное поведение, особенно при сценарии в разных средах.
Оригинал