powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как проверить наличие функции перед ее созданием?
25 сообщений из 38, страница 1 из 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
25 сообщений из 38, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как проверить наличие функции перед ее созданием?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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