powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
12 сообщений из 12, страница 1 из 1
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
    #40135605
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, поставлена следующая задача, требуется при 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
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
    #40135615
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

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

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

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

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

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

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

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

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

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

Код: 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
Автоматическое добавление DESCRIPTION при CREATE_PROCEDURE?
    #40135646
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
Владислав Колосов

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

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


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

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

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

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

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


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

teCa

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

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

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


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

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


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