Я более чем уверен, что многие из вас писали следующий или очень похожий на него код:
if object_id('dbo.test_table', 'U') is not null drop table dbo.test_table; go create table dbo.test_table ( id int not null, name varchar(100) null ); go |
Объекты из базы иногда необходимо удалять, например, в скриптах развертывания новой версии базы данных, либо при тестировании, когда скрипт, создающий новые объекты запускается подряд несколько раз. А если просто попытаться удалить несуществующий объект, то возникнет ошибка и выполнение скрипта прервется. И если вышеуказанный код проверки и удаления таблицы еще выглядит более-менее читабельно, но проверка на существование триггеров и пользователей представляет из себя уже довольно длинное выражение, например:
if exists (select top (1) 1 from sys.triggers as tr where tr.name = 'tr_test') drop trigger tr_test; go create trigger tr_test on dbo.test_table after insert as begin print 'test'; end; go |
В SQL Server 2016 наконец-то появилась возможность в T-SQL удалять объект с проверкой на его существование. Выглядит эта команда вот так: DROP <тип объекта> IF EXISTS <название объекта>. Давайте посмотрим, как вышеуказанные команды будут выглядеть в SQL Server 2016.
drop table if exists dbo.test_table; go drop trigger if exists tr_test; go |
Как видим, теперь это делается гораздо проще и выглядит более понятно. Сейчас новый синтаксис распространяется на следующие типы объектов:
VIEW | FUNCTION | SEQUENCE | INDEX |
PROCEDURE | TRIGGER | DATABASE | SECURITY POLICY |
TABLE | VIEW | SCHEMA | SYNONYM |
ASSEMBLY | RULE | USER | |
ROLE | TYPE | DEFAULT |
Казалось бы, небольшое изменение, но оно очень упрощает работу, т.к. все, что облегчает рутинные операции и минимизирует количество написанного для них кода, в конечном счете увеличивает нашу производительность. Ну и напоследок хочу добавить от себя ложку дегтя. Очень хотелось бы получить команду CREATE OR REPLACE, как в Oracle, т.к. тогда вообще отпадала бы необходимость писать команду удаления. Возможно, в будущих версиях нас все-таки порадуют.