powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Анализ параметров зависимых процедур
25 сообщений из 29, страница 1 из 2
Анализ параметров зависимых процедур
    #39952882
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как найти подобную проблему в БД:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE PROCEDURE p_A 
	@id int,
	@s varchar(100)
AS
BEGIN
	print @s

END
GO

CREATE PROCEDURE p_B
	@id int,
	@s varchar(100),
	@i int
AS
BEGIN
	if (@i < 1)
		exec p_A @id, @s, @i
	else
		print @s
END
GO


EXEC p_B 1, 'a', 0
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952884
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w,


лишить премии разработчиков
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952889
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запустить предварительно написанные тесты. Они упадут.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952892
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич
Запустить предварительно написанные тесты. Они упадут.

Так в том и заключается смысл задачи, что нужно найти проблему до передачи на тестирование.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952893
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну ок, еще как вариант так:

Код: sql
1.
2.
create event session [sqlproc_params_errors] on server
add event [sqlserver].[error_reported] (where [error_number] = 8144)



таргет сами думаю сможете добавить.
насобирать событий и уже на основе данных определить где косяки.

но вам все равно нужно будет запустить на обработку все бизнес процессы. если процедурка в которой есть ошибка не вызовется то и в трассу ничего не получите.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952899
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff

но вам все равно нужно будет запустить на обработку...

Нельзя. Нужен аналитический путь.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952911
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w
felix_ff

но вам все равно нужно будет запустить на обработку...

Нельзя. Нужен аналитический путь.


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


я могу указать вам вектор направления, но это полнейший треш:
берете предстевление sys.sql_expression_dependencies для каждой процедуры находите зависимости других модулей.
рекурсивно для каждой процедуры:
1) получаете ее определение.
2) это определение делите на куски по строкам
3) для каждой зависимости проходитесь перебором строк находя начало вызова модуля по имени
4) начинаете подсчитывать количество параметров по сути дела разделителей (",")
5) тут самое сложное: нужно понять в какой момент остановиться считать, вам нужна будет некая функция возвращаюзая признак закончен ли вызов процедуры к примеру есть ли наличие ";" или найдено выражение новой инструкции и.т.д.
при этом еще надо анализировать не литеральное ли это значение, а если там используется динамика то это в разы усложняет анализ.

6) после подсчета количества параметров сравниваете их с количеством параметров из sys.parameters;
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952915
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

felix_ffэто их прямая обязанность - писать код без ошибок.Ага. Звучит как "их прямая обязанность - быть ротобами". Для выявления ошибок давно придуман процесс тестирования. Почему автор хочеи выявлять ошибки без этого процесса - не понятно.

felix_ffя могу указать вам вектор направленияА если еще вспомнить, что параметры могут быть именоваными, стоять в любом порядке, а так же могут иметь дефолтные значения, то тут целый парсер TSQL понадобится.

Кстати, возможно, SSDT умеет палить такую ситуацию. sbebr6te7w, попробуйте загнать туда базу и сбилдить.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952916
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff

это их прямая обязанность - писать код без ошибок.

Не нужно меня тыкать носом в мои обязанности, мне и нужна эта хрень только ради этого. У меня уже крыша едет после верстки полсотни процедур за день. А проверить я никак не могу.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952917
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич
Почему автор хочеи выявлять ошибки без этого процесса - не понятно.

Потому что я хочу премию получать, а не пи@%#ли. Да и не реально это, архитектура системы настолько дебильная и огромная, что достаточно тронуть одну процедуру и может потребоваться правка сотни других, отвечающих за разные модули системы. Чтобы прогнать тесты всего и вся, наверное, отделу тестирования год придется работать.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952919
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w,


так вы разработкой занимаете сразу на проме чтоли?

А тестовых стендов нет где не страшно запустить процу, которая даже если что то сломает можно будет спокойно тест поднять с бэкапа?
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952921
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w,

На основе sys.parameters формировать строку вида и выполнить ее
Код: sql
1.
exec('set fmtonly on; EXEC p_B null, null, null');


Получите ошибку без фактического выполнения процедуры.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952924
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Шикарно. То есть получается, если передавать null, null, null, то проходит проверка всей процедуры, независимо от условий?
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952930
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w,

кстати да, хороший вариант предложили
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
drop table if exists #err_procs;
create table #err_procs ([name] varchar(255), [msg] nvarchar(4000));


declare @sql nvarchar(max);
declare cur cursor local for
       select
             'begin try exec (''SET FMTONLY ON; EXEC ' + quotename(object_schema_name(o.[object_id])) + '.' + quotename(parsename(o.[name], 1)) + stuff(x.plist, 1, 1, '') + ''') end try begin catch insert into #err_procs ([name], [msg]) values (' + quotename(o.[name], char(39)) + ', ERROR_MESSAGE()); end catch;' 
       from sys.objects o
           cross apply (
                        select ',' + p.[name] + '=null'
                        from sys.parameters p
       		        where p.[object_id] = o.[object_id]
                        for xml path('')
       	               ) x(plist)
       where o.[type] = 'P'
         and o.[is_ms_shipped] = 0
         and o.[schema_id] <> 4;

open cur;
while 1 = 1 begin
     fetch next from cur into @sql;
	 if @@FETCH_STATUS <> 0 break;
	 exec (@sql);
end;
close cur;
deallocate cur;

select * from #err_procs
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39952940
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w,

Неважно что передавать, важно включить fmtonly - тогда процедура просто компилируется без выполнения.
Null - просто универсальное значение. Трудности будут только с параметрами табличного типа.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953166
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ничего не получилось, все нужные процедуры вылетели в ошибку лимита вложенности.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953178
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w
Гавриленко Сергей Алексеевич
Почему автор хочеи выявлять ошибки без этого процесса - не понятно.

Потому что я хочу премию получать, а не пи@%#ли. Да и не реально это, архитектура системы настолько дебильная и огромная, что достаточно тронуть одну процедуру и может потребоваться правка сотни других, отвечающих за разные модули системы. Чтобы прогнать тесты всего и вся, наверное, отделу тестирования год придется работать.
Что поделать, никаких других способов, кроме тестирования, не существует.
Как справиться с этим отделу тестирования, это уж он сам должен придумать (например, написать автоматические тесты), вы же им не начальник, что бы указывать, как работать.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953181
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w
Ничего не получилось, все нужные процедуры вылетели в ошибку лимита вложенности.
Значит делаете не так, как показали. Лимит вложенности можно достичь только при выполнении.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953184
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
Значит делаете не так, как показали. Лимит вложенности можно достичь только при выполнении.

Ну сами попробуйте

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare @i int = 1, @s varchar(max)

while (@i < 35)
begin
	SET @s = '
CREATE PROCEDURE dbo.p_' + FORMAT(@i, '00') + '
	@id int,
	@s varchar(100)
AS
BEGIN
	EXEC dbo.p_' + FORMAT(@i + 1, '00') + ' @id, @s
END'

	--SET @s = 'DROP PROCEDURE dbo.p_' + FORMAT(@i, '00')

	exec(@s)

	set @i = @i + 1
end

EXEC('SET FMTONLY ON; EXEC dbo.p_01 null, null')
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953192
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w,

Ок. И при компиляции тоже, что логично.

Вам предложен способ выявить ошибки компиляции. Выявить только какую-то конкретную ошибку при компиляции не выйдет.

Можете попробовать что-то типа этого - https://blogs.msmvps.com/bsonnino/2018/08/10/parsing-sql-server-code-with-c/
Возможно получится.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953227
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут не в компиляции дело, а в способе. Например:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE [dbo].[p_01]
	@id int,
	@s varchar(100)
AS
BEGIN
	SET @id = @id + 1

	IF (@id < 3)
		EXEC dbo.p_01 @id, @s
END



Без проблем выполнится обычным способом, но уйдет в ошибку лимита при SET FMTONLY ON. По идее к этой фиче должна прилагаться настройка уровня вложенной компиляции, но видимо ее забыли реализовать.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953244
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w
Гавриленко Сергей Алексеевич
Запустить предварительно написанные тесты. Они упадут.

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


Полноценный цикл разработки подразумевает наличие настраиваемой среды на рабочем месте разработчика, в том числе средства создания, отладки и тестирования кода. Разработчик самостоятельно производит тестирование "модульными тестами". Для SQL это, скорее, функциональные, чем модульные. Прежде, чем передавать свою разработку в центральный репозиторий, разработчик обязан убедиться, что тесты работают. Если у вас не так, то уикл разработки затянется из-за множества итераций цикла разработка-тестирование, растянутых по времени обратной связью от тестировщиков.

Говоря конкретно, у разработчика должна быть VS с проектами баз, локальный сервер Developer Edition и проект тестов в общем решении или отдельно, как удобно.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953254
sbebr6te7w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Вы мыслите объемами разработки приложения типа блокнот. А тут речь идет о системе, где одна только sys.sql_expression_dependencies под 200тыс. Меня даже слушать никто не будет, что тут должно быть и как, покоцаю тестовую базу - лишение премии. А потом еще и восстанавливать заставят под крики "быстрей-быстрей".
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953259
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w,

Объем объектов у нас на порядок меньше, но локально тестировать можно независимо от количества объектов, в общем-то. Не обязательно выполнять локально регрессионное тестирование.
...
Рейтинг: 0 / 0
Анализ параметров зависимых процедур
    #39953268
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sbebr6te7w
Владислав Колосов,
Вы мыслите объемами разработки приложения типа блокнот. А тут речь идет о системе, где одна только sys.sql_expression_dependencies под 200тыс.
Ну да, ну да. Сложное приложение и без возможности невозбранно прогнать регресс?
Вы пробовали задать этим вашим "никто" вопрос, как вы должны убедиться, что ваши правки ничего не сломали? Ни в одном из безнес-сценариев? Прогнать их все и выполнить работу тестировщиков? А тестировщики за вас код писать будут взамен?

sbebr6te7w
Меня даже слушать никто не будет, что тут должно быть и как, покоцаю тестовую базу - лишение премии. А потом еще и восстанавливать заставят под крики "быстрей-быстрей".
Могу лишь пожать плечами. Все вышесказанное не характеризует ваш процесс разработки с хорошей стороны.
Поэтому не ждите особого понимания вашей проблемы и боли от того, у кого процесс более-менее нормальный.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Анализ параметров зависимых процедур
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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