powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как проверить наличие функции перед ее созданием?
38 сообщений из 38, показаны все 2 страниц
Как проверить наличие функции перед ее созданием?
    #39704848
Eugenia79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, пожалуйста, как создать скалярную функцию, но предварительно убедиться, что ее еще нет в БД?
Такая конструкция:
IF OBJECT_ID('checkRTFisEmpty', 'SF') is null
begin
CREATE FUNCTION [dbo].[checkRTFisEmpty]
...
end

даёт ошибку: CREATE FUNCTION должна быть единственной в пакете.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704855
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugenia79,

ну обычно проверяю, дропают и создают. Ваш подход только через динамику
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704857
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и FN = SQL scalar function, SF такого нет
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704863
Eugenia79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKну обычно проверяю, дропают и создают. Ваш подход только через динамикуДа, так получилось!
FN исправила.
Спасибо!
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704867
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugenia79,

Если у вас SQL Server 2016 sp1 и выше, используйте create or alter
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704871
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexEugenia79,

Если у вас SQL Server 2016 sp1 и выше, используйте create or alter
если надо как описано, то это совсем не то
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704889
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKEugenia79,

ну обычно проверяю, дропают и создают. Ваш подход только через динамикуНеправда, можно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
IF object_id('checkRTFisEmpty', 'SF') is NOT null
	set noexec on;
go
CREATE FUNCTION [dbo].[checkRTFisEmpty]
...
go
set noexec off;
go

Обратите внимание, что проверяемое условие инвертировано.

В одном батче не получится, это да; если это требуется, то действительно только через динамику.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704897
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor TiegaelTaPaKEugenia79,

ну обычно проверяю, дропают и создают. Ваш подход только через динамикуНеправда, можно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
IF object_id('checkRTFisEmpty', 'SF') is NOT null
	set noexec on;
go
CREATE FUNCTION [dbo].[checkRTFisEmpty]
...
go
set noexec off;
go

Обратите внимание, что проверяемое условие инвертировано.

В одном батче не получится, это да; если это требуется, то действительно только через динамику.
можно и через транзакцию, обсуждались все эти варианты массу раз. Но всё это извращение
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704900
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor TiegaelTaPaKEugenia79,

ну обычно проверяю, дропают и создают. Ваш подход только через динамикуНеправда, можно:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
IF object_id('checkRTFisEmpty', 'SF') is NOT null
	set noexec on;
go
CREATE FUNCTION [dbo].[checkRTFisEmpty]
...
go
set noexec off;
go


Обратите внимание, что проверяемое условие инвертировано.

В одном батче не получится, это да; если это требуется, то действительно только через динамику.

с практической точки зрения такой способ сомнителен.
ибо любое изменение кода функции после ее создания не приведет к изменению функции при его перепроливке.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704905
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетительс практической точки зрения такой способ сомнителен.
ибо любое изменение кода функции после ее создания не приведет к изменению функции при его перепроливке.
Я скажу больше, после выполнение этого кода, функция [dbo].[checkRTFisEmpty] будет возвращать "не-пойми-что".
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704913
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Классика же.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
if object_id ('dbo.checkRTFisEmpty', 'FN') is null
	exec ('create function dbo.checkRTFisEmpty() returns int as begin return 0; end;');
GO

create function dbo.checkRTFisEmpty
(
	@rtf	varchar(max)
)
returns bit
as
begin
	return case when @rtf is null or @rtf in ('', '<типа пустой rtf>') then 1 else 0 end;
end;
GO


И права не слетают, как при drop/create.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704917
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То бишь во втором батче alter, конечно.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704919
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,
Извращение - это создавать объекты в динамике, особенно когда вручную множественный искейпинг писать приходится. Все остальное более или менее компромиссы.

Посетитель,
Вопрос вкуса. "ибо любое изменение кода функции после ее создания не приведет к изменению функции при его перепроливке." - а если этого и не требуется? Разбивать лоб, пытаясь объяснить клиенту, что он ничего не понимает и что пересоздание ему на самом деле нужно? Вперед.

msLex,
"Я скажу больше, после выполнение этого кода, функция [dbo].[checkRTFisEmpty] будет возвращать "не-пойми-что"." - да что вы говорите. А я-то, наивный, думал, что будет возвращать то, на что рассчитывал автор такого скрипта.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704922
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael,

смхема здоровых людей
IF OBJECT_ID() IS NOT NULL DROP
GO
CREATE
GO

авторИ права не слетают, как при drop/create.
права не любители извращатся, раздают на роли и гранты пишут в скрипте создания.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704934
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKсмхема здоровых людей
IF OBJECT_ID() IS NOT NULL DROP
Обычно здоровые, без склероза, люди точно помнят есть у них в базу определённая функция или нет.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704936
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKEnnor Tiegael,

смхема здоровых людей
IF OBJECT_ID() IS NOT NULL DROP
GO
CREATE
GO

авторИ права не слетают, как при drop/create.
права не любители извращатся, раздают на роли и гранты пишут в скрипте создания.
И в каждый скрипт alter "права не любители извращатся" вписывают заново все права, ога, ну точно "смхема здоровых людей".
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39704980
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovTaPaKсмхема здоровых людей
IF OBJECT_ID() IS NOT NULL DROP
Обычно здоровые, без склероза, люди точно помнят есть у них в базу определённая функция или нет.
ну это до того момента пока не начинаешь продавать ПО и у всех разная степень версий

авторИ в каждый скрипт alter "права не любители извращатся" вписывают заново все права, ога, ну точно "смхема здоровых людей".
о чём ты страдалец? скриптов ALTER 0?
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705012
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor TiegaelПосетитель,
Вопрос вкуса. "ибо любое изменение кода функции после ее создания не приведет к изменению функции при его перепроливке." - а если этого и не требуется? Разбивать лоб, пытаясь объяснить клиенту, что он ничего не понимает и что пересоздание ему на самом деле нужно? Вперед.

в том и дело, что "если".
То есть, способ имеет крайне узкую нишу, когда код создается один раз и никогда не обновляется.

drop-create или

wadegwadegКлассика же.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
if object_id ('dbo.checkRTFisEmpty', 'FN') is null
	exec ('create function dbo.checkRTFisEmpty() returns int as begin return 0; end;');
GO

alter function dbo.checkRTFisEmpty
(
	@rtf	varchar(max)
)
returns bit
as
begin
	return case when @rtf is null or @rtf in ('', '<типа пустой rtf>') then 1 else 0 end;
end;
GO



И права не слетают, как при drop/create.

обеспечивают бОльшую гибкость, в том числе, покрывая Ваше "если"
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705027
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKавторИ в каждый скрипт alter "права не любители извращатся" вписывают заново все права, ога, ну точно "смхема здоровых людей".
о чём ты страдалец? скриптов ALTER 0?
Ок, объясняю, раз непонятно. Если функция дропнута и пересоздана, права на нее слетают. Такие вот дела. Что делать будем? При каждом пересоздании заново расписывать все права? Вариант с alter подобной нелепостью не страдает.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705028
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadegwadegTaPaKпропущено...

о чём ты страдалец? скриптов ALTER 0?
Ок, объясняю, раз непонятно. Если функция дропнута и пересоздана, права на нее слетают. Такие вот дела. Что делать будем? При каждом пересоздании заново расписывать все права? Вариант с alter подобной нелепостью не страдает.

повторяю
авторраздают на роли и гранты пишут в скрипте создания.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705038
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKповторяю
авторраздают на роли и гранты пишут в скрипте создания.
В свою очередь, повторять не вижу смысла для write-only тапка.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705043
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadegwadegTaPaKповторяю
пропущено...

В свою очередь, повторять не вижу смысла для write-only тапка.
грант в скрипте создания, скрипты в файлайх, файлы в репозитраии, заяц в утке
Никто не пишет это "руками" каждый раз. Но вы в своей песочнице можете делать всё что хотите
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705055
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKгрант в скрипте создания, скрипты в файлайх, файлы в репозитраии, заяц в утке
Никто не пишет это "руками" каждый раз. Но вы в своей песочнице можете делать всё что хотите
Потом функция меняется через drop/create, и все гранты из скрипта создания улетели куда? Правильно. Теперь их нужно заново устанавливать (что бывает затратно), так что приведенный пример скалярной функции - совершенно не выбор здорового человека.

На самом деле подобные случаи бывают, например, при переделке IF на TF и наоборот, вот тогда без полного перенаката прав не обойтись. Кроме же подобных вынужденных случаев, схема с alter явно предпочтительна.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705058
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadegwadegTaPaKгрант в скрипте создания, скрипты в файлайх, файлы в репозитраии, заяц в утке
Никто не пишет это "руками" каждый раз. Но вы в своей песочнице можете делать всё что хотите
Потом функция меняется через drop/create, и все гранты из скрипта создания улетели куда? Правильно. Теперь их нужно заново устанавливать (что бывает затратно), так что приведенный пример скалярной функции - совершенно не выбор здорового человека.

иисусья тряпка...

файл.sql

IF OBJECT_ID('dbo.prc') IS NOT NULL
DROP PROCEDURE dbo.prc
GO

CREATE PROCEDURE dbo.prc

AS
SET NOCOUNT ON

GO

GRANT EXECUTE ON dbo.prc TO ROLE1
GO


что куда летает
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705069
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опять write-only...
TaPaKGRANT EXECUTE ON dbo.prc TO ROLE1
что куда летает
Неужели до сих пор не нашлось сил прочесть/понять предыдущие посты в этой теме?
Во-первых, даже этих грантов не нужно выписывать после alter'а, в отличие от.
Во-вторых, если эти гранты такие примитивные, то упоминания песочницы становится понятным. В реальных же системах со сложной системой прав формирование и раздача прав на множество иерархических ролей бывает очень непростой и небыстрой процедурой.
Вот всего этого и позволяет избежать alter вместо песочного drop/create.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705079
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadegwadegОпять write-only...
TaPaKGRANT EXECUTE ON dbo.prc TO ROLE1
что куда летает
Неужели до сих пор не нашлось сил прочесть/понять предыдущие посты в этой теме?
Во-первых, даже этих грантов не нужно выписывать после alter'а, в отличие от.
Во-вторых, если эти гранты такие примитивные, то упоминания песочницы становится понятным. В реальных же системах со сложной системой прав формирование и раздача прав на множество иерархических ролей бывает очень непростой и небыстрой процедурой.
Вот всего этого и позволяет избежать alter вместо песочного drop/create.
я так понимаю, что а после create вы мышко гнездовым способом права настраиваите? или они чудом появляются.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705094
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKя так понимаю, что а после create вы мышко гнездовым способом права настраиваите? или они чудом появляются.
И тут не понимаете.

При первичном создании объекта скриптом один раз раздаются права (в простейших случаях явным выписыванием грантов, в сложных системах писанины по сопоставлению/запрету новому объекту прав всей иерархии, соответственно, куда больше). А при alter, который раз уже повторяю, всего этого уже повторно выполнять не требуется.

Черт побери, по-моему, тут объяснять очевидные вещи по которому кругу бессмысленно.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705101
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadegwadegTaPaKя так понимаю, что а после create вы мышко гнездовым способом права настраиваите? или они чудом появляются.
И тут не понимаете.

При первичном создании объекта скриптом один раз раздаются права (в простейших случаях явным выписыванием грантов, в сложных системах писанины по сопоставлению/запрету новому объекту прав всей иерархии, соответственно, куда больше). А при alter, который раз уже повторяю, всего этого уже повторно выполнять не требуется.

Черт побери, по-моему, тут объяснять очевидные вещи по которому кругу бессмысленно.
мышкопрограммисты... Удачи
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705102
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadegwadeg,

+ 1 к альтеру

а "объяснять очевидные вещи" бесполезно, т.к. каждый судит со своей колокольни

однако некоторые допускают наличие "параллельных реальностей", где порядки устроены образом отличным от канонического/колокольного

а некоторые дальше колокольни не видят
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705104
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKмышкопрограммисты... Удачи
Читать учиться уже, видимо, поздно.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705451
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
господа Альтеристы пару вопросов к Вам
1. Как с ваших скриптов развернуть "чистую" БД ? Накатывать дроп.креате а патом пачку альтеров ?
2. У вас как подерживаеться версионость ? Если "чистая версия" относительно первого вопроса ?
3. Релизы состоят из одних альтеров ?
4. Как ведеться разработка ? Если в команде больше 1-го человека ? неужто сначала скриптуем процедуру с сервера а потом меняем ? :)


ЗЫ. Понлстью подерживаю TaPaK :)
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705457
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxxгоспода Альтеристы пару вопросов к Вам
1. Как с ваших скриптов развернуть "чистую" БД ? Накатывать дроп.креате а патом пачку альтеров ?
2. У вас как подерживаеться версионость ? Если "чистая версия" относительно первого вопроса ?
3. Релизы состоят из одних альтеров ?
4. Как ведеться разработка ? Если в команде больше 1-го человека ? неужто сначала скриптуем процедуру с сервера а потом меняем ? :)


ЗЫ. Понлстью подерживаю TaPaK :)

вы поддерживать можете кого хотите. у нас свободная страна.
Но если вы приведенный в топике скрипт альтера прочитать не смогли, то непонятно, как вам что то объяснить.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705467
wadegwadeg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxxгоспода Альтеристы пару вопросов к Вам
1. Как с ваших скриптов развернуть "чистую" БД ? Накатывать дроп.креате а патом пачку альтеров ?
Накатить скрипты (create/alter). Пример скрипта см. выше, просмотрите тему.

Maxx2. У вас как подерживаеться версионость ? Если "чистая версия" относительно первого вопроса ?
Версионность поддерживается вообще другими инструментами. А чистая она или нет - со скриптами по вышеуказанному шаблону неважно.

Maxx3. Релизы состоят из одних альтеров ?

См. п.1.

Maxx4. Как ведеться разработка ? Если в команде больше 1-го человека ? неужто сначала скриптуем процедуру с сервера а потом меняем ? :)

Это не разработка, это поиграться в сервер детского садика. А у взрослых скрипты первичны.

MaxxЗЫ. Понлстью подерживаю TaPaK :)
Это очевидно из ваших вопросов.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705510
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как хорошо, что мы уже лет пять как перевели разработку на SSDT.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705561
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadegwadeg,
угу ,аргументы не о чем :)

кроме "взрослой" супер пупер системы раздачи прав на огбьекты... больше никакого профита
Кроме того моментвы когда надо будет изменить права- альтер для етого дела все равно писать прийдеться.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705568
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxxwadegwadeg,
угу ,аргументы не о чем :)

кроме "взрослой" супер пупер системы раздачи прав на огбьекты... больше никакого профита
Кроме того моментвы когда надо будет изменить права- альтер для етого дела все равно писать прийдеться.

такое ощущение, что вас заставляют пользоваться.
Не хотите - не ешьте.

Если бы вам хотелось понять - вы бы как минимум взглянули на скрипт прежде чем говорить про профит. ибо первый вопрос вы явно задали не подумав.
А остальные(после понимания ответа на первый) должны были отпасть сами собой, ибо они вообще никак не отличаются для вариантов drop/create и предложенного варианта alter

Потому что по сути это некая имитация create or alter, доступной только с 2016 версии
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705647
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давно использую альтер.
Много преимуществ по сравн. с дроп/криейт: не слетают права, в случае ошибки в скрипте, старая версия объекта остается функционировать.

зы: У меня была в работе система, у кот. многим ХП раздавались индивидуальные права на всех пользователей.
Изначально в скрипте давался грант на "паблик", а потом в админпанели право паблик грохалось и каждый юзер грантился отдельно (для новых ХП).
Для таких случаев альтер - отличное решение.
...
Рейтинг: 0 / 0
Как проверить наличие функции перед ее созданием?
    #39705700
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxx,

Так, как у ТС, я на самом деле не делаю, все изменения генерю в SSDT, при необходимости подправляю.

До этого был проект, там клиенты могли перепрыгнуть через несколько версий (локальная БД, ставили у себя, обновлялись тоже сами, как придется). В каждой новой версии добавлялся change script, который переводил БД из версии N-1 в N. Соответственно, если разница составляла 10 релизов, то при первом запуске после обновления прогонялись все скрипты между предыдущей версией БД и текущей. Нормально работало, хотя конечно не очень красиво было при сборке дистрибутива, каждый раз приходилось добавлять еще один файл в проект инсталлятора.

Потом проект умер, по несвязанным причинам, так что в общем пофиг.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как проверить наличие функции перед ее созданием?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]