Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как проверить наличие функции перед ее созданием?  [new]
Eugenia79
Member

Откуда:
Сообщений: 25
Подскажите, пожалуйста, как создать скалярную функцию, но предварительно убедиться, что ее еще нет в БД?
Такая конструкция:
IF OBJECT_ID('checkRTFisEmpty', 'SF') is null
begin
CREATE FUNCTION [dbo].[checkRTFisEmpty]
...
end

даёт ошибку: CREATE FUNCTION должна быть единственной в пакете.
19 сен 18, 12:31    [21679330]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
TaPaK
Member

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

ну обычно проверяю, дропают и создают. Ваш подход только через динамику
19 сен 18, 12:38    [21679345]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5460
ну и FN = SQL scalar function, SF такого нет
19 сен 18, 12:40    [21679348]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
Eugenia79
Member

Откуда:
Сообщений: 25
TaPaK
ну обычно проверяю, дропают и создают. Ваш подход только через динамику
Да, так получилось!
FN исправила.
Спасибо!
19 сен 18, 12:46    [21679359]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
msLex
Member

Откуда:
Сообщений: 5615
Eugenia79,

Если у вас SQL Server 2016 sp1 и выше, используйте create or alter
19 сен 18, 12:54    [21679381]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5460
msLex
Eugenia79,

Если у вас SQL Server 2016 sp1 и выше, используйте create or alter

если надо как описано, то это совсем не то
19 сен 18, 13:00    [21679394]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 2972
TaPaK
Eugenia79,

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

В одном батче не получится, это да; если это требуется, то действительно только через динамику.
19 сен 18, 13:12    [21679421]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5460
Ennor Tiegael
TaPaK
Eugenia79,

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

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

можно и через транзакцию, обсуждались все эти варианты массу раз. Но всё это извращение
19 сен 18, 13:18    [21679436]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
Посетитель
Member

Откуда:
Сообщений: 884
Ennor Tiegael
TaPaK
Eugenia79,

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

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

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


с практической точки зрения такой способ сомнителен.
ибо любое изменение кода функции после ее создания не приведет к изменению функции при его перепроливке.
19 сен 18, 13:18    [21679439]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
msLex
Member

Откуда:
Сообщений: 5615
Посетитель
с практической точки зрения такой способ сомнителен.
ибо любое изменение кода функции после ее создания не приведет к изменению функции при его перепроливке.

Я скажу больше, после выполнение этого кода, функция [dbo].[checkRTFisEmpty] будет возвращать "не-пойми-что".
19 сен 18, 13:21    [21679448]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
wadegwadeg
Member

Откуда:
Сообщений: 31
Классика же.
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.
19 сен 18, 13:30    [21679465]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
wadegwadeg
Member

Откуда:
Сообщений: 31
То бишь во втором батче alter, конечно.
19 сен 18, 13:31    [21679469]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 2972
TaPaK,
Извращение - это создавать объекты в динамике, особенно когда вручную множественный искейпинг писать приходится. Все остальное более или менее компромиссы.

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

msLex,
"Я скажу больше, после выполнение этого кода, функция [dbo].[checkRTFisEmpty] будет возвращать "не-пойми-что"." - да что вы говорите. А я-то, наивный, думал, что будет возвращать то, на что рассчитывал автор такого скрипта.
19 сен 18, 13:31    [21679471]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5460
Ennor Tiegael,

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

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

права не любители извращатся, раздают на роли и гранты пишут в скрипте создания.
19 сен 18, 13:34    [21679477]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 45923
TaPaK
смхема здоровых людей
IF OBJECT_ID() IS NOT NULL DROP

Обычно здоровые, без склероза, люди точно помнят есть у них в базу определённая функция или нет.
19 сен 18, 13:42    [21679494]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
wadegwadeg
Member

Откуда:
Сообщений: 31
TaPaK
Ennor Tiegael,

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

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

права не любители извращатся, раздают на роли и гранты пишут в скрипте создания.

И в каждый скрипт alter "права не любители извращатся" вписывают заново все права, ога, ну точно "смхема здоровых людей".
19 сен 18, 13:42    [21679497]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5460
Dimitry Sibiryakov
TaPaK
смхема здоровых людей
IF OBJECT_ID() IS NOT NULL DROP

Обычно здоровые, без склероза, люди точно помнят есть у них в базу определённая функция или нет.

ну это до того момента пока не начинаешь продавать ПО и у всех разная степень версий

автор
И в каждый скрипт alter "права не любители извращатся" вписывают заново все права, ога, ну точно "смхема здоровых людей".

о чём ты страдалец? скриптов ALTER 0?
19 сен 18, 14:29    [21679585]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
Посетитель
Member

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


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

drop-create или

wadegwadeg
Классика же.
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.


обеспечивают бОльшую гибкость, в том числе, покрывая Ваше "если"
19 сен 18, 14:50    [21679633]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
wadegwadeg
Member

Откуда:
Сообщений: 31
TaPaK
автор
И в каждый скрипт alter "права не любители извращатся" вписывают заново все права, ога, ну точно "смхема здоровых людей".

о чём ты страдалец? скриптов ALTER 0?

Ок, объясняю, раз непонятно. Если функция дропнута и пересоздана, права на нее слетают. Такие вот дела. Что делать будем? При каждом пересоздании заново расписывать все права? Вариант с alter подобной нелепостью не страдает.
19 сен 18, 15:01    [21679657]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5460
wadegwadeg
TaPaK
пропущено...

о чём ты страдалец? скриптов ALTER 0?

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


повторяю
автор
раздают на роли и гранты пишут в скрипте создания.
19 сен 18, 15:02    [21679660]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
wadegwadeg
Member

Откуда:
Сообщений: 31
TaPaK
повторяю
автор
раздают на роли и гранты пишут в скрипте создания.

В свою очередь, повторять не вижу смысла для write-only тапка.
19 сен 18, 15:11    [21679676]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5460
wadegwadeg
TaPaK
повторяю
пропущено...

В свою очередь, повторять не вижу смысла для write-only тапка.

грант в скрипте создания, скрипты в файлайх, файлы в репозитраии, заяц в утке
Никто не пишет это "руками" каждый раз. Но вы в своей песочнице можете делать всё что хотите
19 сен 18, 15:16    [21679681]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
wadegwadeg
Member

Откуда:
Сообщений: 31
TaPaK
грант в скрипте создания, скрипты в файлайх, файлы в репозитраии, заяц в утке
Никто не пишет это "руками" каждый раз. Но вы в своей песочнице можете делать всё что хотите

Потом функция меняется через drop/create, и все гранты из скрипта создания улетели куда? Правильно. Теперь их нужно заново устанавливать (что бывает затратно), так что приведенный пример скалярной функции - совершенно не выбор здорового человека.

На самом деле подобные случаи бывают, например, при переделке IF на TF и наоборот, вот тогда без полного перенаката прав не обойтись. Кроме же подобных вынужденных случаев, схема с alter явно предпочтительна.
19 сен 18, 15:27    [21679700]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5460
wadegwadeg
TaPaK
грант в скрипте создания, скрипты в файлайх, файлы в репозитраии, заяц в утке
Никто не пишет это "руками" каждый раз. Но вы в своей песочнице можете делать всё что хотите

Потом функция меняется через 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


что куда летает
19 сен 18, 15:32    [21679705]     Ответить | Цитировать Сообщить модератору
 Re: Как проверить наличие функции перед ее созданием?  [new]
wadegwadeg
Member

Откуда:
Сообщений: 31
Опять write-only...
TaPaK
GRANT EXECUTE ON dbo.prc TO ROLE1
что куда летает

Неужели до сих пор не нашлось сил прочесть/понять предыдущие посты в этой теме?
Во-первых, даже этих грантов не нужно выписывать после alter'а, в отличие от.
Во-вторых, если эти гранты такие примитивные, то упоминания песочницы становится понятным. В реальных же системах со сложной системой прав формирование и раздача прав на множество иерархических ролей бывает очень непростой и небыстрой процедурой.
Вот всего этого и позволяет избежать alter вместо песочного drop/create.
19 сен 18, 15:42    [21679720]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить