Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE? / 12 сообщений из 12, страница 1 из 1
21.02.2022, 13:10
    #40135605
teCa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
Всем привет, поставлена следующая задача, требуется при CREATE или ALTER процедуры или функции, проверить, оставил ли разработчик комментарий в коде, если нет, то заполнить автоматически ключевые поля, кто/когда создали или исправил.
Я решил не заморачиваться проверкой оставил ли сам разработчик описание, а автоматически оставлять свои "метаданные".

В голову пришло написать такой DDL триггер:

Код: 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.
ALTER TRIGGER [ddl_test]   
ON ALL SERVER
FOR DDL_DATABASE_LEVEL_EVENTS   
AS  
BEGIN
	set nocount on;
	set xact_abort off;
	DECLARE @data XML = EVENTDATA()
	DECLARE @DBname NVARCHAR(255) = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(250)') 
	DECLARE @ObjectName NVARCHAR(250) = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(250)') 
	DECLARE @EventType NVARCHAR(250) = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(250)') 
	DECLARE @TSQLCommand NVARCHAR(MAX) = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')	

	BEGIN TRY
		IF (@EventType != 'UPDATE_STATISTICS' and @DBName != 'tempdb') 
		BEGIN
	
			INSERT INTO [ADMIN].dbo.ddl_log
			([db_name], [db_object_name], [action_name], [tsql_code],author_name)			
			VALUES (@DBName, @ObjectName, @EventType, @TSQLCommand,original_login())
		END
	END TRY
	BEGIN CATCH
    select 'xact_abort = off', error_message();
	END CATCH
END
    
GO


В результате получаю нужные мне поля:
[db_name], [db_object_name], [action_name], [tsql_code],author_name
Но тк как в данном примере я только ловлю уже состоявшееся событие, то теперь мне нужно внести изменения в тело процедуры, добавив описание применив ALTER.

Добавляю в триггер изменения текст запроса на ALTER:
Код: sql
1.
2.
3.
4.
5.
6.
if (@EventType='CREATE_PROCEDURE')
		begin
			set @proc_charindex=CHARINDEX('PROC',@TSQLCommand)
			set @TSQLCommand ='/*DISCRIPTIONS*/'+Char(13)+' ALTER '+ SUBSTRING(@TSQLCommand,@proc_charindex,len(@TSQLCommand))
			--execute sp_sqlexec @TSQLCommand
		end



Осталось последнее - это выполнить execute sp_sqlexec @TSQLCommand в контексте нужной базы данных, как я уже понял, использовать USE [db_name] или [db_name].[dbo].[proc_name] у меня не получится.

Что тут можно использовать?
...
Рейтинг: 0 / 0
21.02.2022, 13:29
    #40135615
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
teCa,

что можно использовать? GIT, pool request, рецензирование.
...
Рейтинг: 0 / 0
21.02.2022, 13:49
    #40135623
teCa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
Владислав Колосов,

Ну, а если не касаться организационных моментов, а спуститься на уровень задачи которую должен решить я, как ДБА?)

Следующим этапом, мне предстоит в описание добавить ссылку на проект в GIT)
...
Рейтинг: 0 / 0
21.02.2022, 14:04
    #40135635
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
teCa,

так поступать, в общем-то нельзя, поскольку процедуры в базе будут отличаться от процедур на сервере и в проект эти изменения сами собой не попадут. Хотя и функциональность кода не будет изменена, но при попытке публикации, например, из VS будут обнаружены изменения и студия будет вынуждена каждый раз переписывать процедуры на сервере, хотя изменений в проекте не было с момента последней публикации.

Если очень хочется документировать, то лучше сохранять заголовки или что требуется о отдельной таблице.
...
Рейтинг: 0 / 0
21.02.2022, 14:29
    #40135640
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
Владислав Колосов

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

+ можно заполнять extended properties созданного объекта, не меняя кода процедуры
...
Рейтинг: 0 / 0
21.02.2022, 14:31
    #40135642
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
Владислав Колосов,
авторпроцедуры в базе будут отличаться от процедур на сервере

описка, процедуры в проекте будут отличаться от процедур на сервере.
...
Рейтинг: 0 / 0
21.02.2022, 14:33
    #40135644
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
Согласен с Владиславом.
Ну еще учтите возможность ошибки - догадайтесь, кто будет виноват, когда ваш триггер поломает рабочую базу при релизе )

Создайте БД DBA, туда логируйте триггером, кто-когда-что изменил + сам текст изменения.
Плюс в этой же базе можно создать отчетик, который выдаст процедуры без ваших обязательных полей.
...
Рейтинг: 0 / 0
21.02.2022, 14:34
    #40135645
teCa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
Пока вот такой вариант решающий данную задачу:

Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
ALTER TRIGGER [ddl_logging]   
ON ALL SERVER
FOR DDL_DATABASE_LEVEL_EVENTS   
AS  
BEGIN
	set nocount on;
	set xact_abort off;
	DECLARE @data XML = EVENTDATA()
	DECLARE @DBname NVARCHAR(255) = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(250)') 
	DECLARE @ObjectName NVARCHAR(250) = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(250)') 
	DECLARE @EventType NVARCHAR(250) = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(250)') 
	DECLARE @TSQLCommand NVARCHAR(MAX) = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')	

	BEGIN TRY
		IF (@EventType != 'UPDATE_STATISTICS' and @DBName != 'tempdb') 
		BEGIN
		declare @proc_charindex int,@UseAndExecStatment nvarchar(max)
			INSERT INTO [ADMIN].dbo.ddl_log
			([db_name], [db_object_name], [action_name], [tsql_code],author_name)			
			VALUES (@DBName, @ObjectName, @EventType, @TSQLCommand,original_login())
		if (@EventType='CREATE_PROCEDURE')
		begin
			set @proc_charindex=CHARINDEX('PROC',@TSQLCommand)
			set @TSQLCommand =  '-- ============================================================================'+Char(10)+'
-- Author:  <'+original_login()+'>'+Char(10)+'
-- Create date: <'+CAST(GETDATE() as nvarchar(28))+'>'+Char(10)+'
-- Server:  <'+@@SERVERNAME+'>'+Char(10)+'
-- Database: <'+@DBName+'>'+Char(10)+'
-- Git:   <>'+Char(10)+'
-- Description: <>'+Char(10)+'
-- ============================================================================'+Char(13)+'
ALTER '+ SUBSTRING(@TSQLCommand,@proc_charindex,len(@TSQLCommand))
			SET @UseAndExecStatment = 'use ' + @DBName +' exec sp_executesql @TSQLCommand'
			EXEC sp_executesql  @UseAndExecStatment,
						N'@TSQLCommand nvarchar(max)', @TSQLCommand=@TSQLCommand
		end

		END
	END TRY
	BEGIN CATCH
    select 'xact_abort = off', @TSQLCommand,error_message();
	END CATCH
END



Следующий этап задачи, имея исходные данные, получить ссылки на проекты в гите, где присутствует данная хранимка. Автор задачи представляет себе так, что разработчик, открывая текст хранимки, должен видеть ссылку на проект в гите. Не представляю пока, возможно ли это в принципе, тк с гитом никогда не работал и что он из себя представляет, понятия не имею, пока из того, что удалось выяснить, что на рабочих станциях у разработчиков установлен гит клиент, в который через командную строку можно отправлять команды и получать какие то данные. Если например, клиент позволяет получить данные по имени объекта и в этих данных будет присутствовать ссылка на него, то и эту графу теоретически можно заполнить.
...
Рейтинг: 0 / 0
21.02.2022, 14:38
    #40135646
teCa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
komrad
Владислав Колосов

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

+ можно заполнять extended properties созданного объекта, не меняя кода процедуры


Вот этот вариант кстати тоже интересный и наверняка боле правильный.

авторСоздайте БД DBA, туда логируйте триггером, кто-когда-что изменил + сам текст изменения.
Плюс в этой же базе можно создать отчетик, который выдаст процедуры без ваших обязательных полей.

Такой лог у меня есть, но в лог ползать не хотят, хотят открыть текст хранимки и все читать в нем.
...
Рейтинг: 0 / 0
21.02.2022, 19:52
    #40135724
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
komrad
Владислав Колосов

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

+ можно заполнять extended properties созданного объекта, не меняя кода процедуры


Скажу честно - это очень геморройно и неудобно, мы так пробовали: обычно копируешь текст из VS, меняешь CREATE на ALTER, а там еще внизу создание свойства, которое уже есть, и оно генерит ошибку. Поначалу терпимо, но через полгода начинает бесить.

teCa

Остановитесь !
Этого не должно быть в триггере. Это можно расставить 1 раз скриптом по всей базе, потом импортировать в проект, а уж гит там или tfs - без разницы. И конечно никаких ссылок на конкретный элемент в системе хранения кода быть не должно. Что вы будете делать, если у вас система хранения переедет на другую машину или другое ПО?
...
Рейтинг: 0 / 0
22.02.2022, 17:37
    #40135936
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
teCa,

"хотят открыть текст хранимки и все читать в нем" неверное решение. Источником кода должен являться проект, а не база данных. Если у вас "программируют на нортоне базе данных", то бегите из этой конторы :).
...
Рейтинг: 0 / 0
23.02.2022, 12:51
    #40136061
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
Владислав Колосов

"хотят открыть текст хранимки и все читать в нем" неверное решение. Источником кода должен являться проект, а не база данных. Если у вас "программируют на нортоне базе данных", то бегите из этой конторы :).


Это когда ты находишься там, где проектируют , а если ты находишься там, где эксплуатируют , то отступать некуда. За тобой пользователь, смотрящий на тебя, как на Бога, а перед тобой только автоматически сгенерированный текст процедуры, понимание которого равносильно расшифровке иероглифов на глиняной табличке.

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


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