Я более чем уверен, что многие из вас писали следующий или очень похожий на него код:
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, т.к. тогда вообще отпадала бы необходимость писать команду удаления. Возможно, в будущих версиях нас все-таки порадуют.