Сегодня я бы хотел поговорить о новшестве, которое пришло к нам из SQL Server 2016 SP1 и которое понравится все разработчикам и даже некоторым администраторам Баз Данных.
Это новшество направлен она упрощение команды DROP IF EXISTS и название ему CREATE OR ALTER.
Прежде чем перейти к рассмотрению нового механизма, я бы хотел вспомнить как раньше мы выполняли данную операцию:
- Удаляем объект, если он существует
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N’dbo.mysproc’) AND OBJECTPROPERTY(id, N’IsProcedure’) = 1 DROP PROCEDURE dbo.mysproc; — Or IF OBJECTPROPERTY(OBJECT_ID(‘dbo.usp_mysproc’), N‘IsProcedure’) = 1 DROP PROCEDURE dbo.mysproc; — Or DROP PROCEDURE IF EXISTS dbo.mysproc;
- Создаём новый объект
CREATE PROCEDURE dbo.mysproc @MyParam int AS (...)
- Восстанавливаем права доступа
GRANT ALTER ON dbo.mysproc TO [that_user]; GO GRANT EXECUTE ON dbo.mysproc TO [that_user]; GO GRANT VIEW DEFINITION ON dbo.mysproc TO [that_user]; GO
Или поиск и обновление объекта:
IF OBJECTPROPERTY(OBJECT_ID(‘dbo.usp_mysproc’), N‘IsProcedure’) = 1 ALTER PROCEDURE dbo.mysproc @MyParam int AS (…)
Теперь можно использовать CREATE OR ALTER, это очень просто и легко:
CREATE OR ALTER PROCEDURE dbo.mysproc @MyParam int AS (...)
CREATE OR ALTER может быть использован в:
- STORED PROCEDURES (включая процедуры для работы с in-memory)
- FUNCTIONS (включая функции для работы с in-memory)
- TRIGGERS
- VIEWS
Но не в:
- Объектах которым необходимо место хранения (tables, indexes and indexed views)
- CLR пользовательские функции
- Deprecated programmability объекты (RULE and DEFAULT)
- Non-programmability объекты (такие как CREATE ASSEMBLY, CREATE TABLE or CREATE SCHEMA). В этих объектах синтаксис CREATE и ALTER сильно отличается.