Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
Доброе утро!
Допустим есть скрипт создания 100500 процедур
Существует только один способ проливки "в лоб" - загружается в SSMS и нажимается выполнить (другие не рассматриваются к сожалению)
Необходимо чтобы в зависимости от некоторого условия скрипт создания процедур либо выполнялся либо нет
1Вариант с динамикой не рассматривается
2Также есть вариант с NOEXEC ON /OFF
IF OBJECT_ID(N'dbo.Sometable') IS NOT NULL
SET NOEXEC ON
ELSE
SET NOEXEC OFF;
GO
IF  (OBJECT_ID(N'[dbo].[proc_1]') is not null)
       DROP PROCEDURE [dbo].[proc_1]
GO

CREATE procedure dbo.proc_1
as
select '1' as ONE
GO
grant exec on dbo.proc_1 TO [somegroup]
go
SET NOEXEC OFF;
go


IF OBJECT_ID(N'dbo.Sometable') IS NOT NULL
SET NOEXEC ON
ELSE
SET NOEXEC OFF;
GO
IF  (OBJECT_ID(N'[dbo].[proc_2]') is not null)
       DROP PROCEDURE [dbo].[proc_2]
GO
CREATE procedure dbo.proc_2
as
select '2' as TWO
GO
grant exec on dbo.proc_2 TO [somegroup]
go
SET NOEXEC OFF;
go

Может есть еще какие то варианты - хотелось бы минимум изменений в скрипте создания
Спасибо!
Да - версия MS SQL 2008
18 авг 17, 09:49    [20733265]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
aleks222
Guest
В порядке бреда

if condition use tempdb
go
18 авг 17, 10:02    [20733301]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
iii2
Member

Откуда:
Сообщений: 202
aleks222
В порядке бреда

if condition use tempdb
go

Может просто ошибку сгенерировать?
18 авг 17, 10:44    [20733426]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
iii2
По поводу ошибки
Нужно чтобы часть блоков (бэтчей) исполнялась по условию, другая часть проливалась бы всегда (условие не действует)
Соответственно низкий уровень серьезности будет действовать до первого GO
А высокий ....
18 авг 17, 11:07    [20733504]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5964
Noexec,

flyway, liquibase... не?
18 авг 17, 11:50    [20733689]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Noexec,

протсо дропните в конце вашего скрипта все процедуры по уловию
18 авг 17, 11:58    [20733730]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
env,
Не (((((
автор
Существует только один способ проливки "в лоб" - загружается в SSMS и нажимается выполнить (другие не рассматриваются к сожалению)
18 авг 17, 11:59    [20733735]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
TaPaK
Noexec,

протсо дропните в конце вашего скрипта все процедуры по уловию

В том то и дело - фишка чтобы они не пролились
18 авг 17, 12:01    [20733754]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Noexec
TaPaK
Noexec,

протсо дропните в конце вашего скрипта все процедуры по уловию

В том то и дело - фишка чтобы они не пролились

это какой-то кулинарный термин?
18 авг 17, 12:02    [20733760]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3462
1. загрузить скрипт в поле таблицы в базе
2. распарсить на куски, процедуры, х.е.з.
3. написать еще один скрпт, который выполняет эти куски по условию
4. купить пива и запустить скрипт 2
18 авг 17, 12:02    [20733764]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
TaPaK
Noexec
пропущено...

В том то и дело - фишка чтобы они не пролились

это какой-то кулинарный термин?

Хорошо - сформулирую по другому Чтобы при некотором условии не происходил/происходил drop и create процедуры (пересоздание) в базе
Это отличается от того что предложили Вы - drop и create (пересоздание) происходит всегда, а потом в конце по условию делается drop
18 авг 17, 12:10    [20733806]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
или так
BEGIN TRAN
IF  (OBJECT_ID(N'[dbo].[proc_1]') is not null)
       DROP PROCEDURE [dbo].[proc_1]
GO

CREATE procedure dbo.proc_1
as
select '1' as ONE
GO
grant exec on dbo.proc_1 TO [somegroup]
GO

IF OBJECT_ID(N'dbo.Sometable') IS NOT NULL
  ROLLBACK TRAN
ELSE
  COMMIT TRAN
GO
18 авг 17, 12:11    [20733810]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
TaPaK
или так
BEGIN TRAN
IF  (OBJECT_ID(N'[dbo].[proc_1]') is not null)
       DROP PROCEDURE [dbo].[proc_1]
GO

CREATE procedure dbo.proc_1
as
select '1' as ONE
GO
grant exec on dbo.proc_1 TO [somegroup]
GO

IF OBJECT_ID(N'dbo.Sometable') IS NOT NULL
  ROLLBACK TRAN
ELSE
  COMMIT TRAN
GO
А вот это красиво !!!!
Спасибо!!!!!!
18 авг 17, 12:20    [20733845]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30801
Noexec
Также есть вариант с NOEXEC ON /OFF
Вариант с NOEXEC нормальный, другие хуже
18 авг 17, 16:29    [20734842]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
alexeyvg,

Согласен
С явной транзакцией хорош тем , что меньше дописывать, но если не дай Бог что то сломается посередине транзакция останется открытой со всеми вытекающими
С Noexec самый безопасный но писать больше
18 авг 17, 16:57    [20734936]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
автор
но если не дай Бог что то сломается посередине транзакция останется открытой со всеми вытекающими

свет выключат? или что там ещё ваш б-г делает
18 авг 17, 16:58    [20734942]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
TaPaK,
Нет - со светом все в порядке )))
А вот есть малая вероятность того , что один из батчей между BEGIN и COMMIT закончится с ошибкой
18 авг 17, 17:39    [20735007]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Noexec,

в самом конце
IF @@TRANCOUNT > 0
ROLLBACK
18 авг 17, 17:41    [20735009]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
TaPaK, не совсем понял
После этого?
IF OBJECT_ID(N'dbo.Sometable') IS NOT NULL
  ROLLBACK TRAN
ELSE
  COMMIT TRAN
GO

Можете показать код в совокупности с вышеприведенным фрагментом
Спасибо!
18 авг 17, 17:53    [20735023]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Noexec,

в самом конце вашего немерянного скрипта
18 авг 17, 17:57    [20735025]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
TaPaK
Так вроде если поставить где нибудь в скрипте доп строчку с ошибкой
drop table not_exists_table
go

То ошибка выкинет из текущего go, но последующие будут продолжаться Далее скрипт наткнется на
IF OBJECT_ID(N'dbo.Sometable') IS NOT NULL
  ROLLBACK TRAN
ELSE
  COMMIT TRAN
GO

И тут @@trancount по любому будет 0, соответственно дальнейшая проверка на @@trancount и ROLLBACK будет лишняя или я не прав
18 авг 17, 18:08    [20735044]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
o-o
Guest
Noexec
TaPaK
Так вроде если поставить где нибудь в скрипте доп строчку с ошибкой
drop table not_exists_table
go

То ошибка выкинет из текущего go, но последующие будут продолжаться Далее скрипт наткнется на

drop table not_exists_table вообще ниоткуда никого не выкидывает.
бэтч продолжается
18 авг 17, 18:33    [20735085]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30801
TaPaK
автор
но если не дай Бог что то сломается посередине транзакция останется открытой со всеми вытекающими

свет выключат? или что там ещё ваш б-г делает
А если эта процедура будет в это время выполняться? Да ещё с изменением планов?
Как то неаккуратненько это.
Всё равно что вместо апдэйта в IF всегда делать апдэйт в транзакции, а потом пусть этот IF откатывает. Зачем такой подход, в чём его преимущества?
18 авг 17, 18:44    [20735098]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
alexeyvg,

да ни в чём, я в обще не понимаю такой подход.
да и @@trancount тоже не нужен... разве что


IF OBJECT_ID(N'dbo.Sometable') IS NOT NULL
ROLLBACK TRAN
ELSE IF @@TRANCOUNT > 0
COMMIT TRAN
GO
18 авг 17, 20:07    [20735275]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт создания процедур по некоторому условию  [new]
Noexec
Guest
Спасибо всем за ответы
TaPaK Вам в особенности!
21 авг 17, 09:23    [20737784]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить