Сегодня я бы хотел поговорить о новшестве, которое пришло к нам из SQL Server 2016 SP1 и которое понравится все разработчикам и даже некоторым администраторам Баз Данных.
Это новшество направлен она упрощение команды DROP IF EXISTS и название ему CREATE OR ALTER.
Прежде чем перейти к рассмотрению нового механизма, я бы хотел вспомнить как раньше мы выполняли данную операцию:
- Удаляем объект, если он существует
1 2 3 4 5 6 7 8 9 10 11 12 |
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; |
- Создаём новый объект
1 |
CREATE PROCEDURE dbo.mysproc @MyParam int AS (...) |
- Восстанавливаем права доступа
1 2 3 4 5 6 |
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 |
Или поиск и обновление объекта:
1 2 |
IF OBJECTPROPERTY(OBJECT_ID(‘dbo.usp_mysproc’), N‘IsProcedure’) = 1 ALTER PROCEDURE dbo.mysproc @MyParam int AS (…) |
Теперь можно использовать CREATE OR ALTER, это очень просто и легко:
1 |
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 сильно отличается.